Управление мега-массивами в PHP

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

Я запускаю этот код в PHP 5.4.4 в терминале (OSX 10.8):

// Settings ini_set('error_reporting', E_ALL); // Shows all feedback from the parser for debugging ini_set('max_execution_time', 0); // Changes the 30 seconds parser exit to infinite ini_set('memory_limit', '512M'); // Sets the memory that may be used to 512MegaBytes echo 'Start memory usage: '.(memory_get_usage(TRUE) / 1024)."\n"; $x = Array(); for ($i = 0; $i < 1e7; $i++) { $x[$i] = 1 * rand(0, 10); //unset($x[$i]); } echo 'End memory usage: '.(memory_get_usage(TRUE) / 1024)."\n"; echo 'Peak memory usage: '.(memory_get_peak_usage(TRUE) / 1024)."\n"; 

Это простой тест с десятимиллионными циклами. Утечка действительно плоха по сравнению с использованием словарей в Python :(.

Когда я игнорирую функцию unset (), чтобы проверить использование, это сразу все единороги и радуги. Так что заставить выпуск памяти, похоже, идет хорошо.

Есть ли способ, который я могу сохранить 10-50 миллионов записей массива в пределах этого предела памяти 512 М?

Я не могу себе представить, когда я буду делать какое-то регулярное выражение с этими типами циклов.

Используйте SplFixedArray потому что вам действительно нужно увидеть, насколько велики массивы PHP (и значения)? (Подсказка: БОЛЬШОЙ!)

 $t = 1e6; $x = array(); for($i = 0; $i < $t; $i ++) { $x[$i] = 1 * rand(0, 10); } 

Вывод

 Start memory usage: 256 End memory usage: 82688 Peak memory usage: 82688 

а также

 $t = 1e6; $x = new SplFixedArray($t); for($i = 0; $i < $t; $i ++) { $x[$i] = 1 * rand(0, 10); } 

Вывод

 Start memory usage: 256 End memory usage: 35584 Peak memory usage: 35584 

Но лучше все же я думаю, что вы должны рассмотреть базу данных на базе памяти, такую ​​как REDIS

Если SplFixedArray не работает для вас, я бы настоятельно рекомендовал использовать RabbitMQ -> http://www.rabbitmq.com/tutorials/tutorial-one-php.html

RabbitMQ проще настроить и использовать, чем обычно думают люди, и у него есть хорошая библиотека для PHP.

С RabbitMQ ваш скрипт может быть в десять, двадцать, сто раз быстрее (в зависимости от количества пользователей, которые вы установили), и вы также можете управлять любым количеством данных.

Я использовал RabbitMQ, чтобы импортировать миллионы строк для получения информации обо всех зарегистрированных в Дании автомобилях, представляющих, насколько это возможно.