Как решить проблему MemoryError при считывании больших Excel файлов?
При считывании методом read_excel() появляется ошибка:
MemoryError: unable to allocate 32.1 mib for an array with shape (10081, 834) and data type object
Работаю с очень большими файлами Excel формата. Есть несколько листов, в каждом по 8к строк и около 1к столбцов. Нужно все конвертировать в один CSV файл. Изначально планировал считывать каждый лист в отдельный DataFrame, а после - соединить их все в один и записать его в CSV файл, но столкнулся с ошибкой выше.
Ответы (2 шт):
Проблема может быть связана с движком, который использует read_excel, по умолчанию это xlrd, но даже у них на гитхабе в первой же строчке написано, что стоит использовать openpyxl. Так что попробуйте другой engine.
Более того, вам совершенно не нужен pandas, если необходимо просто сконвертировать xlsx в csv. Достаточно использовать openpyxl https://stackoverflow.com/a/10803229/9569886
NOTE: судя по тому, что вы хотите писасть несколько листов Excel файла в единственный CSV файл, в решении я буду исходить из того, что во всех листах совпадают имена столбцов.
Пример функции, которая читает по кускам (размер куска управляется параметром chunksize) все листы Excel файла и сохраняет результат в CSV файл:
import pandas as pd
def excel_to_csv(excel_fn, csv_fn, chunksize=1000, **to_csv_kw):
ef = pd.ExcelFile(excel_fn)
cols = ef.parse(nrows=10).columns
# write to CSV column names ONLY (we do it once!)
pd.DataFrame([], columns=cols).to_csv(csv_fn, index=False, **to_csv_kw)
for sheet in ef.sheet_names:
rows_read = 0
while True:
df = ef.parse(
sheet_name=sheet,
skiprows=1+rows_read,
nrows=chunksize,
header=None,
names=cols)
df.to_csv(csv_fn, index=False, header=None,
mode="a", **to_csv_kw)
rows_read += len(df)
if len(df) < chunksize:
break
Примеры вызова:
excel_to_csv(r"c:\download\file.xlsx", r"c:\temp\out.csv", chunksize=2000, sep=";")