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

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

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

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

5
задан 3 July 2014 в 20:21
3 ответа

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

unzip -p <zipfile> | split -C <size>
1
ответ дан 3 December 2019 в 02:03

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

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

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

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

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

.
0
ответ дан 3 December 2019 в 02:03

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

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

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

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

.
0
ответ дан 3 December 2019 в 02:03

Теги

Похожие вопросы