gpt4 book ai didi

python - 在 Psycopg2 中高效地插入大量行

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:51 26 4
gpt4 key购买 nike

我需要高效地将大约 500k(给或取 100k)行数据插入我的 PostgreSQL 数据库。经过大量谷歌搜索后,我找到了这个解决方案,平均大约需要 150(挂钟)秒。

def db_insert_spectrum(curs, visual_data, recording_id):
sql = """
INSERT INTO spectrums (row, col, value, recording_id)
VALUES %s
"""

# Mass-insertion technique
# visual_data is a 2D array (a nx63 matrix)
values_list = []
for rowIndex, rowData in enumerate(visual_data):
for colIndex, colData in enumerate(rowData): # colData is the value
value = [(rowIndex, colIndex, colData, recording_id)]
values_list.append(value)

psycopg2.extras.execute_batch(curs, sql, values_list, page_size=1000)

有没有更快的方法?

最佳答案

基于answers given here , COPY是最快的方法。 COPY 从文件或类似文件的对象中读取。

因为内存 I/O 是 many orders of magnitude比磁盘 I/O 更快,将数据写入 StringIO 更快类文件对象而不是写入实际文件。psycopg 文档显示了调用 copy_from 的示例以 StringIO 作为输入。

因此,您可以使用类似的东西:

try:
# Python2
from cStringIO import StringIO
except ImportError:
# Python3
from io import StringIO

def db_insert_spectrum(curs, visual_data, recording_id):
f = StringIO()
# visual_data is a 2D array (a nx63 matrix)
values_list = []
for rowIndex, rowData in enumerate(visual_data):
items = []
for colIndex, colData in enumerate(rowData):
value = (rowIndex, colIndex, colData, recording_id)
items.append('\t'.join(map(str, value))+'\n')
f.writelines(items)
f.seek(0)
cur.copy_from(f, 'spectrums', columns=('row', 'col', 'value', 'recording_id'))

关于python - 在 Psycopg2 中高效地插入大量行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47116877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com