【问题标题】:What is the fastest way to bulk load a file (created by Postgres) into an in-memory SQLite database using Python 3?使用 Python 3 将文件(由 Postgres 创建)批量加载到内存 SQLite 数据库中的最快方法是什么?
【发布时间】:2017-11-23 05:51:41
【问题描述】:

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

目前我正在考虑以下两种选择:

哪个更快?也许还有第三种更快的选择?

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

如果没有人对此有任何经验,我会确保稍后发布基准作为答案。

编辑:这个问题被否决了。从 cmets 看来,这似乎是由于缺乏基准测试。如果没有,请告诉我如何改进这个问题。我绝对不指望任何人为我执行基准测试。我只是希望有人有批量加载到 SQLite 的经验。

【问题讨论】:

  • 您的测量结果如何?
  • @JLH 我希望有经验的大容量加载到 SQLite 的人在我为测试目的而双重实施解决方案之前得到答案。如果我没有收到任何人的消息,我将进行测试并将其发布在这里作为答案。我绝对不希望任何人为我做基准测试的麻烦。我只希望以前有人可能这样做过。我已经添加了 python 3 标签,谢谢。
  • copy 速度很快

标签: postgresql python-3.x sqlite bulkinsert


【解决方案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 分钟。我们没有测试替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多