Как разделить огромный файл CSV в Linux?
У меня есть 60 ТБ данных, которые находятся в 12 CSV-файлах.
Данные будут загружены в кластерную базу данных, где процессы загрузки являются однопоточными. Чтобы улучшить производительность загрузки, мне нужно инициировать процесс загрузки с каждого узла.
Пока все хорошо с этой точки зрения. Моя самая большая проблема - как я могу разделить эти данные? Это заархивировано, и каждый файл CSV имеет около 5 ТБ данных! Я пробовал сплит, но это занимает слишком много времени!
3 ответа
Самый простой, но не самый быстрый, скорее всего, способ
unzip -p <zipfile> | split -C <size>
При условии, что порядок данных не важен, один из способов сделать это - не так быстро, но, по крайней мере, несколько параллельно, - написать скрипт, который выполняет следующие действия.
- Откройте почтовый файл.
- Получите первый файл.
- Прочитайте данные из файла, скажем, в строках.
- Для каждой строки csv запишите новый zip-файл, содержащий строку.
- Поверните выбранный файл (скажем, пять zip-файлов), используя вывод одной строки.
- Как только вы достигнете определенного размера (скажем, 50 ГБ), создайте новый zip-файл.
Это не быстрее, чем последовательное чтение большого файла, но позволяет вам разбить файл на более мелкие куски, которые можно загружать параллельно, в то время как оставшиеся данные завершены.
Как и большинство сжатых выходных данных, они недоступны для поиска (вы не можете перейти на X байт вперед), поэтому самый большой недостаток, который у вас есть, - это если по какой-то причине процесс прерывается, вам придется перезапустить все с нуля.
Python предоставляет поддержку для выполнения чего-то подобного через модуль zipfile.
Нужно ли загружать 12 файлов по порядку или они могут быть импортированы параллельно?
Я спрашиваю, потому что может показаться, что если они должны быть загружены по порядку, то их дальнейшее разделение не позволит вам запустить что-либо параллельно, а если нет, вы можете импортировать 12 файлов, которые у вас уже есть параллельно.
Если файлы еще не доступны на узлах, их передача может занять столько же времени, сколько и импорт.
Узкие места могут появляться в удивительных местах. Вы запустили однопотоковый процесс импорта и убедились, что узлы используются недостаточно? Возможно, вы решаете не ту проблему, если не проверили.