2016-08-24 4 views
0

Я пытаюсь reserialize с 1gb SQL дамп с помощью файла фикс-serialization.php из https://github.com/Blogestudio/Fix-Serialization/blob/master/fix-serialization.phpPHP CLI работает из памяти

с этой командой:

php -d memory_limit=-1 fix-serialization.php dump.sql 

Но я получаю следующее сообщение об ошибке

PHP Fatal error: Out of memory (allocated 2328100864) (tried to allocate 18446744071742389167 bytes) 

я получаю ту же ошибку с тем, когда я пытаюсь:

php -d memory_limit=2000M fix-serialization.php dump.sql 

Очевидно, что на моем компьютере не было 18446744071 ГБ бара. Я получаю эту ошибку как на MBP, так и на моей машине Ubuntu, и я пробовал запустить этот скрипт на php5.6 и 7

+0

Невозможно ли разбить этот файл на разные части? –

+0

Разбить файл на более мелкие сегменты - http://stackoverflow.com/a/28719267/2182349 – user2182349

ответ

1

Похоже, вы решили сделать свое собственное решение. Этот скрипт не подходит, так как он читает весь файл сразу, а затем передает весь файл в preg_replace. Это регулярное выражение довольно сложно, поэтому для обработки таких больших строк требуется большая память. Вы должны read one data line, затем proccess эту строку и записать ее в выходной файл. Open входной файл для чтения и выходной файл для записи, поэтому данные не будут повреждены.

+0

Итак, при чтении файла строки за строкой (в том же скрипте) использование памяти уменьшается? Таким образом, память выделяется только при регулярном регулярном выражении по строке и не накапливается для всего скрипта? – rugbert

+0

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

+0

Это потрясающе. Итак, я просто возьму это регулярное выражение и попробую запустить его против дампа по строке в строке. – rugbert

Смежные вопросы