The documentation "forgot" to specify quotes in the expression:
USE Test VIA SDFDBE
DbInfo () I need to, as I fairly standard default settings.
DbeBuild () is a DBESYS ().
In DBESYS () the only thing that I did - changed. F. to. T.:
LOCAL aDbes := { { "DBFDBE", .T.},;
{ "NTXDBE", .T.},;
{ "DELDBE", .F.},;
{ "SDFDBE", .T.} } // <=== .F. to .T.
Testing the performance showed that velocity is the same as with dbf.
The documentation states that sdf-file and the number of fields in which only really limited computer hardware.
But really it was 4 GB and artisanal method was 230Gb.
Measured the length of the string in the database soda. It turned out to be about 31,000 characters. This is considerably less than it should be at 100,000 fields. Perhaps you need to set specific parameters sdf-file or have to give them up.
Create a blank database cdf-100000 fields on 100,000 records took 25 minutes, and my makeshift method - 34 minutes
Code: Select all
#include 'dmlb.ch'
#include 'SdfDbe.ch'
PROCEDURE AppSys
// Рабочий стол остается окном приложения
RETURN
DbeSys() // Подключение механизмов баз данных
******************************************************************
FUNCTION Main()
LOCAL Getlist := {}, oProgress, oDialog
DC_IconDefault(1000)
*DbeSetDefault( "DBFNTX" )
*DbeBuild( "SDFNTX" , "SDFDBE" , "NTXDBE" )
**** Определение максимальной длины текстовой переменной для строки базы данных
**mTXT = ""
*DO WHILE .T.
* mTXT = mTXT + REPLICATE("#",1000000)
*ENDDO
* Оказалось текстовая переменная может содержать до 282 млн.символов. Этого более чем достаточно
N_Cls = 100000 // Число классов
N_Rec = 100000 // Число признаков
N_Col = N_Cls+5 // Число полей
********** Структура создаваемой базы
aStructure := { { "Kod_pr", "N", 15, 0},; // 1
{ "Name" , "C", 15, 0} } // 2
FOR j=1 TO N_Cls
FieldName = "N"+ALLTRIM(STR(j,15))
AADD(aStructure, { FieldName, "N", 19, 2 })
NEXT
AADD(aStructure, { "Summa", "N", 19, 2 })
AADD(aStructure, { "Sredn", "N", 19, 2 })
AADD(aStructure, { "Disp" , "N", 19, 2 })
**************************************
IF FILE("TestSDF.txt");ERASE("TestSDF.txt");ENDIF
DbCreate( "TestSDF", aStructure, "SDFDBE" ) // Создать БД с использованием механизма SDF
CLOSE ALL
USE TestSDF EXCLUSIVE NEW VIA 'SDFDBE' // Открыть с использованием механизма SDF
******* Эксперимент по определению скорости обращения к базам данных TXT и DBF
****** Создание пустой sdf-базы *************
nMax = N_Rec
Mess = 'Создание файла'
@ 4,5 DCPROGRESS oProgr SIZE 80,1.1 MAXCOUNT nMax COLOR GRA_CLR_CYAN PERCENT EVERY 100
DCREAD GUI TITLE Mess PARENT @oDial FIT EXIT
oDial:show()
nTime = 0
DC_GetProgress(oProgr,0,nMax)
nTimeON := SECONDS()
SELECT TestSDF
FOR i=1 TO N_Rec
APPEND BLANK
* FieldPut( 1, i ) // Запись поля в БД (корректная)
* FieldPut( 2, STR(i,15) ) // Запись поля в БД (корректная)
* FOR j=3 TO N_Col
* FieldPut( j, i*10000+j ) // Запись поля в БД (корректная)
* NEXT
DC_GetProgress(oProgr, ++nTime, nMax)
NEXT
DC_GetProgress(oProgr,nMax,nMax)
nTimeOFF := SECONDS()
MsgBox("Время исполнения="+ALLTRIM(STR(nTimeOFF-nTimeON))+" сек.")
oDial:Destroy()
CLOSE ALL
RETURN NIL
//////////////////////////////////////////////////////////////////////
//
// DBESYS.PRG
//
// Copyright:
// Alaska Software, (c) 1998-2009. All rights reserved.
//
// Contents:
// Xbase++ DatabaseEngine startup/preloader
//
// Syntax:
// DbeSys() is called automatically at program start before the
// function MAIN.
//
//////////////////////////////////////////////////////////////////////
#define MSG_DBE_NOT_LOADED " database engine not loaded"
#define MSG_DBE_NOT_CREATED " database engine could not be created"
*******************************************************************************
* DbeSys() is always executed at program startup
*******************************************************************************
PROCEDURE dbeSys()
/*
* The lHidden parameter is set to .T. for all database engines
* which will be combined to a new abstract database engine.
*/
*DbeBuild( "SDFNTX" , "SDFDBE" , "NTXDBE" )
LOCAL aDbes := { { "DBFDBE", .T.},;
{ "NTXDBE", .T.},;
{ "DELDBE", .F.},;
{ "SDFDBE", .T.} } // Поменял .F. на .T.
LOCAL aBuild :={ { "DBFNTX", 1, 2 } }
LOCAL i
/*
* Set the sorting order and the date format
*/
SET COLLATION TO AMERICAN
SET DATE TO AMERICAN
/*
* load all database engines
*/
FOR i:= 1 TO len(aDbes)
IF ! DbeLoad( aDbes[i][1], aDbes[i][2])
Alert( aDbes[i][1] + MSG_DBE_NOT_LOADED , {"OK"} )
ENDIF
NEXT i
/*
* create database engines
*/
FOR i:= 1 TO len(aBuild)
IF ! DbeBuild( aBuild[i][1], aDbes[aBuild[i][2]][1], aDbes[aBuild[i][3]][1])
Alert( aBuild[i][1] + MSG_DBE_NOT_CREATED , {"OK"} )
ENDIF
NEXT i
RETURN
//
// EOF