YOgen
Знающий
- Сообщения
- 58
- Репутация
- 5
OffTopic:
Сразу оговорюсь - может не в тот раздел закинул... сильно ногами не пинать
Сразу оговорюсь - может не в тот раздел закинул... сильно ногами не пинать
Очень понадобилось мне вносить большие массивы данных в БД SQLite, а после их считывать.
И очень не нравилось, что посредством SQLite.au3 оператором "SELECT" 35000 строк вытягиваются секунд 8-9 (как уже ни крутил).
Вот нашел вариант с использованием sqlite3.exe (http://www.sqlite.org/2013/sqlite-shell-win32-x86-3071700.zip) как можно добиться очень даже хороших результатов.
В данном примере показано на сколько шустрее идет INSERT с использованием sqlite3.exe.
Код:
#include <Array.au3>
#include <Constants.au3>
#include <SQLite.dll.au3>
#include <SQLite.au3>
Opt("TrayIconDebug", 1)
$sCreateTable_Query = "CREATE TABLE IF NOT EXISTS Test(" & _
"'Num1' INTEGER," & _
"'Num2' INTEGER" & _
");"
$iRepeatTimes = 50000
;================== _SQLiteUDF ====
_SQLite_Startup()
$hSQLiteDB = _SQLite_Open()
;_SQLite_Exec($hSQLiteDB, "PRAGMA synchronous = OFF;")
$hTimer = TimerInit()
_SQLite_Exec($hSQLiteDB, $sCreateTable_Query)
$iDiff = TimerDiff($hTimer)
ConsoleWrite("_SQLiteUDF_CreateTable - " & $iDiff/1000 & @CRLF)
$hTimer = TimerInit()
For $i = 1 To $iRepeatTimes
_SQLite_Exec($hSQLiteDB, "INSERT INTO Test('Num1','Num2') VALUES('A_" & $i & "','B_" & $i & "');")
Next
$iDiff = TimerDiff($hTimer)
ConsoleWrite("_SQLiteUDF_InsertData - " & $iDiff/1000 & @CRLF)
;Local $aSQLResult[2], $iRows, $iColumns
;_SQLite_GetTable2d($hSQLiteDB, "SELECT * FROM Test;", $aSQLResult, $iRows, $iColumns)
;_ArrayDisplay($aSQLResult)
_SQLite_Close($hSQLiteDB)
_SQLite_Shutdown()
;==================================
;================== _SQLiteEXE ====
$hTimer = TimerInit()
$iPID = Run(@ComSpec & " /c " & @ScriptDir & "\sqlite3.exe", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($iPID, $sCreateTable_Query)
$iDiff = TimerDiff($hTimer)
ConsoleWrite("_SQLiteEXE_CreateTable - " & $iDiff/1000 & @CRLF)
$hTimer = TimerInit()
For $i = 1 To $iRepeatTimes
StdinWrite($iPID, "INSERT INTO Test('Num1','Num2') VALUES('A_" & $i & "','B_" & $i & "');")
Next
$iDiff = TimerDiff($hTimer)
ConsoleWrite("_SQLiteEXE_InsertData - " & $iDiff/1000 & @CRLF)
;StdinWrite($iPID, "SELECT * FROM Test;")
StdinWrite($iPID)
;Local $sOut
;While 1
; $sOut &= StdoutRead($iPID)
; If @error Then ExitLoop
;Wend
;MsgBox(64, "", $sOut)
;$aResult = StringRegExp($sOut, "(.*)\R", 3)
;_ArrayDisplay($aResult)
;==================================
Мой результат (Phenom II 3.0 GHz):
_SQLiteUDF_InsertData - 8.86560758804427
_SQLiteEXE_InsertData - 0.483283505374842
Хотелось бы услышать мысли присутствующих по данному факту... :whistle: