2017-06-20 9 views
0

我有一個很大的數據集,我想加載到SQLite內存數據庫中。我計劃從Postgres導出的文件中加載數據。什麼文件格式和加載機制是最快的?使用Python 3批量加載文件(由Postgres創建)到內存中的SQLite數據庫的最快方法是什麼?

目前我正在考慮以下兩個選項:

哪個更快?也許有更快的選擇嗎?

這將作爲Python 3腳本的一部分完成。這會影響選擇嗎?

如果沒有人有這方面的經驗,我會確保發佈基準作爲答案後。

編輯:這個問題已經得到了一個downvote。從評論看來,這是由於缺乏基準。如果沒有,請讓我知道如何改善這個問題。我絕對不希望任何人爲我執行基準測試。我只是希望有人有批量加載到SQLite的經驗。

+1

你的測量結果是什麼? –

+0

@JLH我希望有人有經驗批量加載到SQLite有一個答案,然後我去雙測試目的的解決方案的麻煩。如果我沒有聽到任何人的消息,我會做測試並將它們發佈在這裏作爲答案。我絕對不希望有人爲我做基準測試的麻煩。我只是希望以前有人可能會這樣做。我已經添加了python 3標記,謝謝。 –

+0

'copy'的速度一樣快 –

回答

1

原來,沒有很好的方式來使用pg_dump並以高性能的方式插入語句。當我們使用CSV和pg_dump策略時,我們最終從源文件逐行插入。我們將使用CSV方法,每個批次使用executemany加載10000行。

import sqlite3 
from datetime import datetime 
import csv 

conn = sqlite3.connect(":memory:") 
cur = conn.cursor() 
create_query = """ 
    CREATE VIRTUAL TABLE my_table USING fts4(
     id INTEGER, 
     my_field TEXT 
    ); 
""" 
cur.execute(create_query) 

csv.field_size_limit(2147483647) 

from_time = datetime.now() 
with open('test.csv', 'r', encoding="utf8") as file: 
    csv_file = csv.reader(file) 
    header = next(csv_file) 
    query_template = """ 
     INSERT INTO my_table (id, my_field) 
     VALUES (?, ?); 
    """ 
    for batch in split_iterable_by_size(csv_file, 10000): 
     cur.executemany(query_template, batch) 
     conn.commit() 

在我們的系統和數據集上花了2小時30分鐘。我們沒有測試替代方案。

相關問題