Как выписать из памяти csv используя python? - PullRequest
1 голос
/ 29 марта 2019

Мне нужно вывести результаты запроса SQL в CSV. Результаты запроса будут за пределами моей памяти. Кроме того, операции csv в пандах обычно выполняются намного медленнее, чем при использовании библиотеки csv, поэтому я бы предпочел не использовать панд.

Я попытался создать приведенный ниже код с намерением пакетировать список из 1000 строк, а затем добавить их к содержимому в файл CSV. Когда я запускаю его, моей системе просто не хватает памяти, и она не работает так, как я ожидал.

Я не уверен, что делаю неправильно или есть что-то, чего я просто не понимаю.

ROWS_AT_ONCE = 1000

curr.execute(
'''
SELECT
*
FROM '''+Table_Name+'''

;
'''
)
rows = curr.fetchall()
headers = list(map(lambda x: x[0], curr.description))
headers = tuple(headers)
csv_w_pointer = open(Export_Path_Name, 'a' , newline='')
csv_writer = csv.writer(csv_w_pointer, delimiter='\t', quotechar='"')
csv_writer.writerow(headers)
batch = list()
for row in rows:
    batch.append(row)
    if len(batch) >= ROWS_AT_ONCE:
        csv_writer.writerow(batch)
    batch = list()
if batch:
    csv_writer.writerow(batch)
del batch

Мне нужно записать результаты sql в csv, когда не хватает памяти. Моя текущая попытка не удалась из-за превышения памяти.

Ответы [ 2 ]

4 голосов
/ 29 марта 2019

Вам следует избегать использования метода fetchall, если ваш набор данных большой.Вместо этого используйте метод fetchmany, чтобы извлекать только определенное количество строк за раз, и немедленно записывайте извлеченные строки в CSV, чтобы минимизировать использование памяти:

ROWS_AT_ONCE = 1000

curr.execute(
'''
SELECT
*
FROM '''+Table_Name+'''

;
'''
)
headers = list(map(lambda x: x[0], curr.description))
headers = tuple(headers)
with open(Export_Path_Name, 'a' , newline='') as csv_w_pointer:
    csv_writer = csv.writer(csv_w_pointer, delimiter='\t', quotechar='"')
    csv_writer.writerow(headers)
    while True:
        rows = curr.fetchmany(ROWS_AT_ONCE)
        if not rows:
            break
        csv_writer.writerows(rows)
0 голосов
/ 29 марта 2019

Вместо всех циклов CSV, вы можете использовать библиотеку odo

запись csv в sql

Пример sqlite

и один пример для записи CSV-файла 33 ГБ


Другой вариант - скрипт csv2sqlite.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...