Для фейри вниз. Я знаю, что php – это неправильный язык для этого … но я работаю под внешними ограничениями. При условии:
У меня большой плоский файл, который мне нужно обрабатывать в php. Я конвертирую плоский файл в нормализованную базу данных в mysql. В плоском файле имеется несколько миллионов строк.
Первоначально я пытался использовать ORM-систему при импорте плоского файла. С этой конструкцией возникла серьезная проблема с утечкой памяти php даже при тщательном освобождении объектов. Даже если я гарантирую, что хватит памяти, сценарию потребуется около 25 дней для работы на моем рабочем столе.
Я удалил накладные расходы и переписал сценарий, чтобы напрямую строить команды mysql. Я удалил AUTO INCREMENT из моего дизайна, так как это потребовало от меня, как Mysql, что последний идентификатор был введен для установления отношений между точками данных. Я просто использую глобальный счетчик для идентификаторов базы данных, и я никогда не занимаюсь поиском, просто вставляет.
Я использую команду unix split для создания большого количества небольших файлов вместо одного большого, потому что есть лишние ресурсы памяти, связанные с использованием указателя файла снова и снова.
Используя эти оптимизации (надеюсь, что они помогли кому-то еще), я получил скрипт импорта в течение примерно 6 часов.
Я арендовал виртуальный экземпляр в 5 раз больше ОЗУ и примерно в 5 раз больше мощности процессора, чем мой рабочий стол, и заметил, что он прошел точно так же быстро. Сервер запускает процесс, но имеет запасные циклы процессора и оперативную память. Возможно, ограничивающим фактором является скорость диска. Но у меня много ОЗУ. Должен ли я как-то загружать файлы в память? Любые предложения по дальнейшей оптимизации скриптов командной строки php, обрабатывающих большие файлы, приветствуются!