需求:使用Python从S3加载数百万行到表中,并避免内存问题
我看到有两种方法,即psycopg2的copy_from和copy_expert。
这两种方法中哪一种最有效并避免内存问题?
此外,我发现Redshift(基于Postgres)支持COPY命令从S3文件加载数据,但不确定Postgres数据库是否支持此功能。
需求:使用Python从S3加载数百万行到表中,并避免内存问题
我看到有两种方法,即psycopg2的copy_from和copy_expert。
这两种方法中哪一种最有效并避免内存问题?
此外,我发现Redshift(基于Postgres)支持COPY命令从S3文件加载数据,但不确定Postgres数据库是否支持此功能。
copy_from
的实现方式,改为了copy_expert
。可以在这里找到有关PostgreSQL负载的详细分析:https://hakibenita.com/fast-load-data-python-postgresql。
COPY_FROM
def insert_with_string_io(df: pd.DataFrame, table_name: str):
buffer = io.StringIO()
df.to_csv(buffer, index=False, header=False)
buffer.seek(0)
with conn.cursor() as cursor:
try:
cursor.copy_from(file=buffer, table=table_name, sep=",", null="")
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
COPY_EXPERT
def insert_with_string_io(df: pd.DataFrame):
buffer = io.StringIO()
df.to_csv(buffer, index=False, header=False)
buffer.seek(0)
with conn.cursor() as cursor:
try:
cursor.copy_expert(f"COPY <database>.<schema>.<table> FROM STDIN (FORMAT 'csv', HEADER false)" , buffer)
except (Exception, psycopg2.DatabaseError) as error:
print("Error: %s" % error)
S3
复制。其次,copy_from
与copy_expert
并不是真正的问题。问题在于来自S3
的网络延迟和流式传输行。 - Adrian Klavercopy_from
和copy_expert
之间的主要区别是什么?我的理解是两者都具有从文件加载数据到表中的相同功能。 - Karcopy_from
有一部分可用的COPY
选项子集,而copy_expert
允许您提交自己的COPY
字符串并选择选项。更多详细信息请参见从这里开始的完整命令。 - Adrian Klaver