Я знаю, что вы сказали, что хотите использовать собственные приложения, но GNU Parallel позволит вам выполнять отдельные процессы параллельно, что позволит вам выполнять эту операцию быстрее:
sudo apt-get update
sudo apt-get install parallel
awk -F',' '{print $8}' file.csv | parallel -j+0 cdrtoip {}
Есть многочисленные способы вызова параллельного
, но вышеупомянутый метод будет принимать выходные данные из 8-го столбца файла .csv и выполнять один процесс cdrtoip
для каждого ядра в вашей системе, в каждой строке одновременно . Таким образом, если вы используете 4 ядра, вы можете выполнить это задание за 25% времени, которое обычно требуется для выполнения.
Положительная сторона parallel
заключается в том, что он отслеживает вывод и генерирует его по порядку, как если бы это было только одно выполняемое задание.
После установки, man parallel
, чтобы узнать о других способах выполнения (или просмотрите документацию по ссылке). Извините, если это не то, что вы ищете, но это приходило мне на помощь много раз в прошлом.
РЕДАКТИРОВАТЬ: Если вы хотите добавить вывод обратно в .csv, чтобы заменить 8-й столбец, пример ниже будет работать , а был протестирован . Выполнение CSV-файла на 5000 строк на двухъядерном Macbook Pro занимает около 3,25 минуты.
Настройка:
$ cat file.tmp
blah1,blah2,blah3,blah4,blah5,blah6,blah7,1175063050,blah9,blah10,blah11
$ for i in {1..5000}; do cat file.tmp; done > file.csv
$ wc -l < file.csv
5000
Скрипт (с использованием cdrtoip
, который вы предоставили):
$ cat csvjob.sh
#!/bin/bash
fragment1="$(cut -d, -f1-7 file.csv | tr ',' "\t")"
fragment2="$(cut -d, -f8 file.csv | parallel -j+0 cdrtoip {})"
fragment3="$(cut -d',' -f9- file.csv | tr ',' "\t")"
paste <(echo "$fragment1") <(echo "$fragment2") <(echo "$fragment3") | sed "s/\t/,/g" > newfile.csv
Результат:
$ time ./csvjob.sh
real 3m23.092s
user 1m22.245s
sys 2m57.794s
$ head -3 newfile.csv
blah1,blah2,blah3,blah4,blah5,blah6,blah7,10.10.10.70,blah9,blah10,blah11
blah1,blah2,blah3,blah4,blah5,blah6,blah7,10.10.10.70,blah9,blah10,blah11
blah1,blah2,blah3,blah4,blah5,blah6,blah7,10.10.10.70,blah9,blah10,blah11
Другое редактирование: На четырехъядерном процессоре было выполнено следующее Mac Mini (также работает и другое):
$ time ./csvjob.sh
real 2m12.171s
user 2m59.816s
sys 2m15.787s
Я также только что понял, что вы сказали 500 000 строк вместо 5 000 строк.Чтобы узнать, что это стоит, посмотрите статистику ниже для выполнения cdrtoip
5 000 раз подряд:
$ time for i in {1..5000}; do cdrtoip 1175063050; done > /dev/null
real 2m32.487s
user 1m26.537s
sys 1m8.270s
Окончательное редактирование: Следующее было выполнено на файле 500 000 строк на четырехъядерном процессоре Mac Mini, на котором, как указывалось ранее, уже было запущено несколько приложений:
$ time ./csvjob.sh
real 216m22.780s
user 301m40.694s
sys 239m44.404s
Я полностью понимаю, что вы имеете в виду, OP.
Даже при параллельной работе это занимает довольно много времени.
Я вижу, что OP нашла лучшее решение. 126 секунд на файл сложно превзойти. Опять же, для чего это стоит, ниже представлена статистика запуска изначально предоставленного cdrtoip
с 500000 строк .csv с использованием параллельного
(который, как я понимаю, OP не может установить) на 8-ядерная виртуальная машина Debian:
$ time ./csvjob.sh
real 14m7.467s
user 6m3.883s
sys 4m18.556s
Содержимое /etc/mysql
создается с помощью mysql-server-5.7
postinst
(, заменяя «5.7» на любую версию, которая у вас есть ). Вы должны попробовать запустить
sudo dpkg-reconfigure mysql-server-5.7
и исправление возникающих ошибок.
Как полностью переустановить mysql? объясняет, как полностью переустановить MySQL. Однако обратите внимание, что удаление /var/lib/mysql
удалит любую базу данных, которую вы создали.