Я пытаюсь создать datafrmae из файла с фиксированной пропускной способностью и загрузить в базу данных postgresql. Мой входной файл очень большой (~ 16 ГБ) и 20 миллионов записей. Поэтому, если я создаю фрейм данных, он потребляет большую часть доступной оперативной памяти. Это займет много времени, чтобы завершить. Поэтому я подумал об использовании опции 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'
Моя основная цель - повысить производительность. Пожалуйста, помогите мне решить проблему или предложите лучший подход. Заранее спасибо.