【发布时间】:2018-05-01 15:54:20
【问题描述】:
我正在尝试从固定宽度文件创建一个 datafrmae 并加载到 postgresql 数据库中。我的输入文件非常大(~16GB)和 2000 万条记录。因此,如果我创建数据框,它会消耗大部分可用的 RAM。需要很长时间才能完成。所以我想到了使用 chunksize(使用 python 生成器)选项并将记录提交到表中。但它因'AttributeError: 'generator' object has no attribute 'to_sql' 错误而失败。
受此答案启发 https://stackoverflow.com/a/47257676/2799214
输入文件:test_file.txt
XOXOXOXOXOXO9
AOAOAOAOAOAO8
BOBOBOBOBOBO7
COCOCOCOCOCO6
DODODODODODO5
EOEOEOEOEOEO4
FOFOFOFOFOFO3
GOGOGOGOGOGO2
HOHOHOHOHOHO1
sample.py
import pandas.io.sql as psql
import pandas as pd
from sqlalchemy import create_engine
def chunck_generator(filename, header=False,chunk_size = 10 ** 5):
for chunk in pd.read_fwf(filename, colspecs=[[0,12],[12,13]],index_col=False,header=None, iterator=True, chunksize=chunk_size):
yield (chunk)
def _generator( engine, filename, header=False,chunk_size = 10 ** 5):
chunk = chunck_generator(filename, header=False,chunk_size = 10 ** 5)
chunk.to_sql('sample_table', engine, if_exists='replace', schema='sample_schema', index=False)
yield row
if __name__ == "__main__":
filename = r'test_file.txt'
engine = create_engine('postgresql://ABCD:ABCD@ip:port/database')
c = engine.connect()
conn = c.connection
generator = _generator(engine=engine, filename=filename)
while True:
print(next(generator))
conn.close()
错误:
chunk.to_sql('sample_table', engine, if_exists='replace', schema='sample_schema', index=False)
AttributeError: 'generator' object has no attribute 'to_sql'
我的主要目标是提高性能。请帮助我解决问题或建议更好的方法。提前致谢。
【问题讨论】:
-
chunck_generator是一个没有to_sql()方法的生成器对象。您可能需要使用current_chunk = next(chunk)来获取块。另外,row没有定义。 -
@TwistedSim 是的,我同意。无论如何我可以解决这个问题。我应该保留数据框属性。
-
您希望在哪里定义这个
to_sql方法?当然不是在所有的生成器上,或者所有的可迭代对象上,或者你通过一个函数的yielding 值创建的特定生成器?如果您也想调用 DataFrame 的方法,则必须在 DataFrame 上调用它,而不是在其他类型的对象上调用。
标签: python python-3.x pandas dataframe generator