PHP - *быстро* сериализируют/не сериализируют?

У меня есть Сценарий PHP, который создает дерево двоичного поиска по довольно большому файлу CSV (5 МБ +). Это хорошо и все, но требуется приблизительно 3 секунды для считанного/анализирования/индексирования файла.

Теперь я думал, что мог использовать serialize() и unserialize() ускорить процесс. Когда файл CSV не изменился тем временем, нет никакого смысла в парсинге его снова.

К моему ужасу я нахожу тот вызов serialize() на моем индексном объекте занимает 5 секунд и производит огромное (19 МБ) текстовый файл, тогда как unserialize() занимает невыносимые 27 секунд для чтения его назад. Улучшения выглядят немного отличающимися.;-)

Таким образом - существует ли более быстрый механизм для хранившего/восстанавливания графиков большого объекта к/от диску в PHP?

(Для разъяснения: я ищу что-то, что берет значительно меньше, чем вышеупомянутые 3 секунды, чтобы сделать задание десериализации.)

15
задан Tomalak 30 March 2010 в 14:04
поделиться

4 ответа

Даже если вы обнаружите вариант «двоичного формата сериализации», скорее всего, даже это будет медленным для того, что вы себе представляете.

Таким образом, то, что вам, возможно, придется изучить в использовании (как упоминали другие), - это база данных, memcached или онлайн-веб-сервис.

Я хотел бы также добавить следующие идеи:

  • кэширование запросов/ответов
  • Ваш PHP-скрипт не отключается, а становится сетевым сервером для ответа на запросы
  • или, осмелюсь сказать, изменения структуры данных и метода запроса, который вы в настоящее время используете
4
ответ дан 1 December 2019 в 02:29
поделиться

Я вижу здесь два варианта

сериализация строки, в простейшей форме что-то вроде

  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);

Это будет интересно протестировать оба варианта и сравнить результаты.

2
ответ дан 1 December 2019 в 02:29
поделиться

Если вы хотите, чтобы скорость записи или чтения из файловой системы была ниже оптимальной.

В большинстве случаев сервер базы данных сможет хранить и извлекать данные гораздо эффективнее, чем сценарий PHP, который читает / записывает файлы.

Другой вариант - что-то вроде Memcached .

Сериализация объектов известна не своей производительностью, а простотой использования и определенно не подходит для обработки больших объемов данных.

1
ответ дан 1 December 2019 в 02:29
поделиться

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, чтобы сделать его исполняемым.

10
ответ дан 1 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: