Большие каналы CSV Go слишком много памяти - PullRequest
0 голосов
/ 02 июня 2018

Хорошо, у меня есть массивный CSV-файл 2.5G, который составляет около 25 миллионов записей с 20 столбцами. Я пытаюсь использовать GO, чтобы обработать этого монстра и выполнить некоторое форматирование, а затем вставить его в базу данных.У меня есть базовая настройка кода с каналами, потому что я решил, что это будет быстрее всего при использовании подпрограмм go и таких: здесь

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

Может ли кто-нибудь помочь мне с этим кодом и посмотреть, смогу ли я одновременно создать очередь из чтения файла, пока он обрабатывает и вставляет?

1 Ответ

0 голосов
/ 02 июня 2018

Для каждой записи вашего большого CSV-файла вы запускаете новую программу.Каждая процедура распределяет ~2kB стек.Не рекомендуется запускать программу для всего.

Попробуйте использовать конвейер, основная программа будет читать записи и отправлять через channel1.

Вы запускаете, например.10 рабочих процедур, которые обрабатывают записи, полученные от channel1, и отправляют обработанные значения через channel2.

Тогда некоторые другие 10 процедур получат значения из channel2 и вставят их в базу данных.

Здесь - несколько примеров для конвейеров.

...