У меня есть Сценарий PHP, который создает дерево двоичного поиска по довольно большому файлу CSV (5 МБ +). Это хорошо и все, но требуется приблизительно 3 секунды для считанного/анализирования/индексирования файла.
Теперь я думал, что мог использовать serialize()
и unserialize()
ускорить процесс. Когда файл CSV не изменился тем временем, нет никакого смысла в парсинге его снова.
К моему ужасу я нахожу тот вызов serialize()
на моем индексном объекте занимает 5 секунд и производит огромное (19 МБ) текстовый файл, тогда как unserialize()
занимает невыносимые 27 секунд для чтения его назад. Улучшения выглядят немного отличающимися.;-)
Таким образом - существует ли более быстрый механизм для хранившего/восстанавливания графиков большого объекта к/от диску в PHP?
(Для разъяснения: я ищу что-то, что берет значительно меньше, чем вышеупомянутые 3 секунды, чтобы сделать задание десериализации.)
Даже если вы обнаружите вариант «двоичного формата сериализации», скорее всего, даже это будет медленным для того, что вы себе представляете.
Таким образом, то, что вам, возможно, придется изучить в использовании (как упоминали другие), - это база данных, memcached или онлайн-веб-сервис.
Я хотел бы также добавить следующие идеи:
Я вижу здесь два варианта
сериализация строки, в простейшей форме что-то вроде
write => implode("\x01", (array) $node);
read => explode() + $node->payload = $a[0]; $node->value = $a[1] etc
двоичной сериализации с помощью pack ()
write => pack("fnna*", $node->value, $node->le, $node->ri, $node->payload);
read => $node = (object) unpack("fvalue/nre/nli/a*payload", $data);
Это будет интересно протестировать оба варианта и сравнить результаты.
Если вы хотите, чтобы скорость записи или чтения из файловой системы была ниже оптимальной.
В большинстве случаев сервер базы данных сможет хранить и извлекать данные гораздо эффективнее, чем сценарий PHP, который читает / записывает файлы.
Другой вариант - что-то вроде Memcached .
Сериализация объектов известна не своей производительностью, а простотой использования и определенно не подходит для обработки больших объемов данных.
var_export
будет намного быстрее, так как PHP не придется обрабатывать строку:
// export the process CSV to export.php
$php_array = read_parse_and_index_csv($csv); // takes 3 seconds
$export = var_export($php_array, true);
file_put_contents('export.php', '<?php $php_array = ' . $export . '; ?>');
Затем включите export.php, когда он вам понадобится:
include 'export.php';
В зависимости от настроек вашего веб-сервера, вам может потребоваться chmod
export.php, чтобы сделать его исполняемым.