ошибка pyarrow версии 1.0 вызывает исключение из памяти при чтении большого количества файлов с использованием ParquetDataset (работает нормально с версией 0.13)

#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 работает для одного файла.