#python #pyarrow #apache-arrow
#python #pyarrow #apache-arrow
Вопрос:
У меня есть разделенный фрейм данных, который хранится в более чем 5000 файлах. Я использую ParquetDataset (имена).read () для загрузки всех файлов. Я обновил pyarrow до последней версии 1.0.1 с 0.13.0, и он начал выдавать «ошибка ОС: не хватает памяти: сбой malloc размером 131072». Тот же код на том же компьютере по-прежнему работает с более старой версией. На моем компьютере 256 ГБ памяти более чем достаточно для загрузки данных, для которых требуется < 10 ГБ. Вы можете использовать приведенный ниже код для создания проблемы на вашей стороне.
# create a big dataframe
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': np.arange(50000000)})
df['F1'] = np.random.randn(50000000) * 100
df['F2'] = np.random.randn(50000000) * 100
df['F3'] = np.random.randn(50000000) * 100
df['F4'] = np.random.randn(50000000) * 100
df['F5'] = np.random.randn(50000000) * 100
df['F6'] = np.random.randn(50000000) * 100
df['F7'] = np.random.randn(50000000) * 100
df['F8'] = np.random.randn(50000000) * 100
df['F9'] = 'ABCDEFGH'
df['F10'] = 'ABCDEFGH'
df['F11'] = 'ABCDEFGH'
df['F12'] = 'ABCDEFGH01234'
df['F13'] = 'ABCDEFGH01234'
df['F14'] = 'ABCDEFGH01234'
df['F15'] = 'ABCDEFGH01234567'
df['F16'] = 'ABCDEFGH01234567'
df['F17'] = 'ABCDEFGH01234567'
# split and save data to 5000 files
for i in range(5000):
df.iloc[i*10000:(i 1)*10000].to_parquet(f'{i}.parquet', index=False)
# use a fresh session to read data
# below code works to read
import pandas as pd
df = []
for i in range(5000):
df.append(pd.read_parquet(f'{i}.parquet'))
df = pd.concat(df)
# below code crashes with memory error in pyarrow 1.0/1.0.1 (works fine with version 0.13.0)
# tried use_legacy_dataset=False, same issue
import pyarrow.parquet as pq
fnames = []
for i in range(5000):
fnames.append(f'{i}.parquet')
len(fnames)
df = pq.ParquetDataset(fnames).read(use_threads=False)
Комментарии:
1. Не могли бы вы открыть отчет об ошибке об этом? См. issues.apache.org/jira/projects/ARROW/issues (красная кнопка «Создать» вверху). Кроме того, вы получаете то же сообщение об ошибке с
use_legacy_dataset
значением True или False?2. Я не думаю, что у меня есть разрешение / возможность открыть JIRA по указанной вами ссылке, не могли бы вы, пожалуйста, сделать это для меня? Сообщение об ошибке с use_legacy_dataset= False выдает «завершение вызова после создания экземпляра ‘std::bad_alloc'».
3. Любой может открыть JIRA, обычно вам не нужно иметь никаких специальных разрешений. Вам может потребоваться только создать учетную запись (но которая в любом случае понадобится для дальнейшего ответа / комментария по проблеме JIRA). Я думаю, что проще всего было бы, если бы вы могли открыть JIRA, так как будет несколько последующих вопросов, чтобы попытаться диагностировать проблему (например: работает ли чтение одного файла с
pq.read_table()
? Что, если вы закомментируете последние несколько столбцов строки? ..) (Я не могу это проверить, потому что у меня недостаточно памяти, чтобы попробовать с таким большим набором данных. С данными, в 10 раз меньшими, пример кода работает нормально для меня)4. Спасибо, я создал JIRA ( issues.apache.org/jira/browse/ARROW-9974 ). pq.read_table работает для одного файла.