Как запрашивать и экспортировать большой набор данных в Python Pandas - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица базы данных SQL Server в Amazon RDS, и я запускаю скрипт python на сервере 8 ГБ в AWS EC2.Код Python просто выбирает все данные в большой таблице и пытается преобразовать их в EC2.Экземпляру EC2 быстро не хватает памяти, хотя я пытаюсь извлекать данные ежегодно, однако я бы хотел, чтобы все данные были извлечены в CSV (мне не обязательно использовать Pandas)

Какна данный момент код данных pandas очень прост

query= 'select * from table_name'
df = pd.read_sql(query,cnxn)
df.to_csv(target_name, index=False)

Я вижу ошибку

Traceback (последний вызов был последним): df = pd.read_sql (query, cnxn)
MemoryError

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Здесь вы захотите использовать собственные инструменты управления базой данных SQL вместо Python / Pandas.

  • Если это база данных MySQL,
    mysql ... --batch --execute='select * from table_name' > my-file.csv
  • Если это база данных PostgreSQL, в psql сделать что-то вроде
    \copy (select * from table_name) To './my-file.csv' With CSV
  • Если это SQL Server, (через здесь)
    sqlcmd -S MyServer -d myDB -E -Q "select * from table_name" -o "my-file.csv" -h-1 -s"," -w 700

Если вы действительно действительно хотите использовать Pandas, вы можете обойтись с chunksize параметром (отрегулируйте соответственно, если у вас заканчивается память) :

with open('my_csv.csv', 'w') as f:
    for i, partial_df in enumerate(pd.read_sql(query, cnxn, chunksize=100000)):
        print('Writing chunk %s' % i)
        partial_df.to_csv(f, index=False, header=(i == 0))
0 голосов
/ 05 июля 2019

Если вы можете использовать read_sql с пандами, у вас наверняка есть драйвер, который позволяет напрямую запрашивать базу данных с интерфейсом DB-API 2.0, а затем записывать с модулем csv по одной записи за раз:

con = ...   # it depends on your currect driver
curs = con.cursor()
curs.execute('select * from table_name')
with open(target_name, 'w', newline='') as fd:
    wr = csv.writer(fd)
    wr.writerow([d[0] for d in curs.description])    # write the header line
    while True:                                      # loop on the cursor
        row = curs.fetchone()
        if not row: break                            # until the end of rows
        wr.writerow(row)                             # and write the row
curs.close()
con.close()
...