Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Significant memory and swap usage during conversion from jsonl.zst to parquet #34

Open
capricornusx opened this issue Nov 8, 2024 · 3 comments
Assignees
Labels
bug Something isn't working

Comments

@capricornusx
Copy link

При конвертации файлов jsonl.zst в формат parquet, очень сильно вырастает потребление RAM и SWAP. Программа завершается c помощью OOMKiller. Нагрука на CPU - незначительная

Размер исходного файла от 5 до 8Gb

Интересно, что в коде я не увидел явной поддержки zst, может какие-то нюансы у формата..

undatum convert --format-in jsonl ~/records0.jsonl.zst test.parquet

OS: Linux 6.10.13 (x86_64)
RAM: 32Gb DDR5
Storage: SSD NVMe
CPU: AMD Ryzen 7 7700 8-Core
@ivbeg
Copy link
Contributor

ivbeg commented Nov 9, 2024

В undatum преобразование файлов перестроено на библиотеку iterabledata https://github.com/apicrafter/pyiterable/ и там весь код кодеков и поддерживаемых типов файлов.

Вот эта ситуация связана не с zst форматом, а с тем что идет преобразование в parquet формат.
У parquet есть недостаток в том что структура данных не динамична и преобразование в него возможно двумя способами:

  1. Через pandas происходит почти всегда гарантированное преобразование, но датасет помещается в память на период обработки. Pandas динамически обновляет схему датафрейма при экспорте в parquet.
  2. Через библиотеку pyarrow преобразование идёт потоковым образом, но нужна, или схема данных на вход, или она считывается из первого батча. Это означает что первый батч должен быть достаточно большим чтобы в него попали все записи в которых может меняться схема данных. Потому что если новые поля в JSON будут в последующих записях, то преобразование данных оборвётся.

Поэтому для совместимости сейчас используется преобразование через pandas, но да, оно плохо работает на больших файлах JSONL файлах.

Я могу добавить автопереключение в режим pyarrow для JSONL файлов или опции для undatum меняющие режим работы.

Пока вот пример по преобразованию JSONL файла с помощью библиотеки pyiterable в потоковом режиме.

import os
import sys
from iterable.datatypes import JSONLinesIterable, ParquetIterable
from iterable.codecs import ZSTDCodec

RAW_FILE = sys.argv[1]
RESULT_PARQUET_FILE = sys.argv[2]
BATCH_SIZE = 10000

def run():
        codec_obj = ZSTDCodec(RAW_FILE, mode='r')
        iterable = JSONLinesIterable(codec=codec_obj)        
        writerable = ParquetIterable(RESULT_PARQUET_FILE, mode=w', use_pandas=False, adapt_schema=True, batch_size=BATCH_SIZE)
      
        n = 0
        rows = []
        for row in iterable:
                n += 1     
                rows.append(row)
                if n % BATCH_SIZE == 0:
                        writerable.write_bulk(rows)
                        rows = []
        if len(rows) > 0:
                writerable.write_bulk(rows)
        iterable.close()
        writerable.close()

if __name__ == "__main__":
        run()

@ivbeg ivbeg self-assigned this Nov 9, 2024
@ivbeg ivbeg added the bug Something isn't working label Nov 9, 2024
@ivbeg ivbeg moved this to 🏗 In progress in undatum backlog Nov 9, 2024
@capricornusx
Copy link
Author

понял. Наверное можно оба вариант, по умолчанию будет происходит переключение, если файл больше чем 80% RAM, или явно передать опцию, если точно хотим потоковый вариант

И в доку дописать этот нюанс )

@capricornusx
Copy link
Author

Кстати, на днях, случилось так, что смог нарастить RAM до 96Gb и всё равно проблема такая же

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Status: 🏗 In progress
Development

No branches or pull requests

2 participants