Сохраните много больших DataFrames Pandas в один файл паркета без загрузки в память - PullRequest
0 голосов
/ 31 мая 2019

Я хочу попытаться сохранить много больших DataFrames Pandas, которые не помещаются в память сразу, в один файл Parquet. Мы хотели бы иметь один большой паркетный файл на диске, чтобы быстро извлечь нужные столбцы из этого одного большого файла.

В частности, у нас есть ~ 200 небольших файлов паркета, каждый из которых содержит ~ 100 столбцов (генов) и 2 миллиона строк (ячеек). Каждый паркет на диске довольно маленький - около 40 МБ и ~ 8 ГБ для всех ~ 200 файлов Parquet. Данные очень скудны (> 90% значений - нули), и Паркет хорошо справляется со сжатием данных на диске до небольшого размера.

Поскольку набор данных разреженный, мы можем использовать разреженные массивы Pandas / Scipy, чтобы загрузить все ~ 25 000 генов (столбцов) и 2 миллиона строк (клеток) в единую разреженную структуру данных. Однако мы не можем написать SparseDataFrame напрямую в Parquet (см. Выпуск Github https://github.com/pandas-dev/pandas/issues/26378), и преобразование всей матрицы в плотное приведет к исчерпанию памяти (например, плотный массив из 2000 столбцов / генов и 2 миллионов строк) / ячейки занимают 30 ГБ ОЗУ.) Это мешает нам создавать один большой файл Parquet, который мы хотим.

В этой презентации Питера Хоффмана (https://youtu.be/fcPzcooWrIY?t=987 в 16 минут 20 секунд) упоминается, что вы можете передавать данные в файл Parquet (вести записи о метаданных), не сохраняя все данные в памяти. Можно ли передавать столбцы / строки в файл паркета? Я не мог найти пример этого, используя Панд. Поддерживают ли это PyArrow или FastParquet?

...