for*_*dyt 4 python postgresql psycopg2
我需要有效地向我的PostgreSQL数据库插入大约500k(给出或接受100k)数据行.经过大量的谷歌搜索,我已经得到了这个解决方案,平均大约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)
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?
unu*_*tbu 10
根据这里给出的答案,COPY是最快的方法.COPY从文件或类文件对象中读取.
由于内存I/O 比磁盘I/O快许多个数量级,因此将数据写入类StringIO文件对象比写入实际文件更快.psycopg文档显示了copy_from使用 StringIOas输入调用的示例.
因此,您可以使用以下内容:
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'))
Run Code Online (Sandbox Code Playgroud)