使用Python 3将文件(由Postgres创建)批量加载到内存中的SQLite数据库的最快方法是什么?

时间:2017-06-20 15:28:59

标签: postgresql python-3.x sqlite bulkinsert

我想要加载到SQLite内存数据库中的大型数据集。我计划从Postgres导出的文件中加载数据。什么文件格式和加载机制最快?

目前我正在考虑以下两个选项:

哪个更快?还有第三个更快的选择吗?

这将作为Python 3脚本的一部分完成。这会影响选择吗?

如果没有人有这方面的经验,我会确保稍后发布基准作为答案。

编辑:这个问题引起了人们的注意。从评论来看,这似乎是由于缺乏基准测试。如果没有,请告诉我如何改进这个问题。我绝对不希望任何人为我进行基准测试。我只是希望有人事先有批量加载到SQLite的经验。

1 个答案:

答案 0 :(得分: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分钟。我们没有测试替代方案。