Назад | Перейти на главную страницу

Как разбить огромный CSV-файл в Linux?

У меня есть 60 ТБ данных, которые находятся в 12 файлах CSV.

Данные будут загружены в кластерную базу данных, где процессы загрузки являются однопоточными. Чтобы улучшить производительность загрузки, мне нужно инициировать процесс загрузки с каждого узла.

Пока все хорошо с этой точки зрения. Моя самая большая проблема - как я могу разделить эти данные? Он заархивирован, и каждый файл csv содержит около 5 ТБ данных! Я пробовал разделить, но это занимает слишком много времени!

Самый простой, но не самый быстрый, скорее всего, способ

unzip -p <zipfile> | split -C <size>

Предполагая, что порядок данных не важен, один из способов сделать это - не очень быстрый, но, по крайней мере, в некоторой степени параллельный, - это написать сценарий, который делает следующее.

  1. Откройте zip-файл.
  2. Получите первый файл.
  3. Считайте данные из файла, скажем, по строкам.
  4. Для каждой строки csv напишите новый zip-файл, содержащий эту строку.
  5. Поверните выбранный файл (скажем, пять zip-файлов), используя вывод одной строки.
  6. Как только вы достигнете определенного размера (скажем, 50 ГБ), создайте новый zip-файл.

Это не быстрее, чем последовательное чтение большого файла, но позволяет разделить файл на более мелкие части, которые можно загружать параллельно, пока остальные данные будут завершены.

Как и большинство сжатых выходных данных, его нельзя искать (вы не можете перескочить на X байтов вперед), поэтому самый большой недостаток, который у вас есть, - это если процесс по какой-то причине прерывается, вам придется перезапустить все с нуля.

Python предоставляет поддержку для подобных действий через zip-файл модуль.

Нужно ли загружать 12 файлов по порядку или их можно импортировать параллельно?

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

Если файлы еще не доступны на узлах, их перенос может занять столько же времени, сколько и импорт.

Узкие места могут обнаруживаться в неожиданных местах. Вы начали процесс однопоточного импорта и убедились, что узлы недостаточно загружены? Возможно, вы решаете не ту проблему, если не проверили.