使用 Python 3 将文件(由 Postgres 创建)批量加载到内存中的 SQLite 数据库的最快方法是什么?
What is the fastest way to bulk load a file (created by Postgres) into an in-memory SQLite database using Python 3?
我有一个大型数据集要加载到 SQLite 内存数据库中。我计划从从 Postgres 导出的文件中加载数据。哪种文件格式和加载机制最快?
目前我在考虑以下两个方案:
- 正在导入 CSV 文件(copy). Reference.
- 运行 一个 SQL 文件(pg_dump) with INSERT statements using a single transaction. Reference.
哪个更快?也许还有第三种更快的选择?
这将作为 Python 3 脚本的一部分完成。这会影响选择吗?
如果没有人对此有任何经验,我会确保 post 基准测试作为稍后的答案。
编辑:这个问题得到了反对票。从评论来看,这似乎是由于缺乏基准测试。如果没有,请让我知道如何改进这个问题。我绝对不希望有人为我执行基准测试。我只是希望有人有过批量加载到 SQLite.
的经验
事实证明,使用 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 分钟。我们没有测试替代方案。
我有一个大型数据集要加载到 SQLite 内存数据库中。我计划从从 Postgres 导出的文件中加载数据。哪种文件格式和加载机制最快?
目前我在考虑以下两个方案:
- 正在导入 CSV 文件(copy). Reference.
- 运行 一个 SQL 文件(pg_dump) with INSERT statements using a single transaction. Reference.
哪个更快?也许还有第三种更快的选择?
这将作为 Python 3 脚本的一部分完成。这会影响选择吗?
如果没有人对此有任何经验,我会确保 post 基准测试作为稍后的答案。
编辑:这个问题得到了反对票。从评论来看,这似乎是由于缺乏基准测试。如果没有,请让我知道如何改进这个问题。我绝对不希望有人为我执行基准测试。我只是希望有人有过批量加载到 SQLite.
的经验事实证明,使用 pg_dump 并以高效的方式插入语句并没有很好的方法来做到这一点。当我们使用 CSV 和 pg_dump 策略时,我们最终都从源文件中逐行插入。我们将使用 CSV 方法使用 executemany
.
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 分钟。我们没有测试替代方案。