@Nikelamoc

Как наименее русурсоемко записать массив в файл?

День добрый.
Надо записать массив в файл с минимальными затратами по оперативке и цпу.
Сейчас это делается так
foreach($array as $key => $value) {
$price_array[$key] = $value[price];
}
$filename = dirname(__FILE__) . "/data/price.txt";
file_put_contents($file, '<?php $price_array = ' . var_export($price_array, true) . ';');


Я так понимаю, что надо делать как-то через fwrite, но как там строку запаковать ?
Я пытался через серилизацию, но выходит битый массив.

И самое главное, если там массив на 50к значений, вот такое построчное писание в файл скрипт не повесит ?
  • Вопрос задан
  • 374 просмотра
Решения вопроса 1
@unity_ultra_hardcore
Сильно зависит от структуры словаря. Если только строковые ключи-значения, то можно попробовать вот так его писать: https://gist.github.com/sc0rp10/0cef7c64aad392a2e799.
Дальше советую обложиться профайлерами и самостоятельно выяснить, что выгоднее: писать построчно из большого словаря в памяти, либо один раз его сдампить в файл целиком. Ну а там уже делать вывод, что конкретно в вашем случае больше подходит.
Лично мне кажется, что задумываться о скорости выполнения var_export + file_put_contents стоит, например, с объема данных в сотни мегабайт. В том смысле, что на более мелких объемах, эти вызовы займут крайне мало времени на фоне общего времени выполнения и смысла экономить буквально на спичках не будет.
Но, повторюсь, все надо профилировать, а не гадать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Apathetic
@Apathetic
Frontend
Ну, два способа (сериализация и var_export) вы уже испытали, попробуйте теперь json_encode. Этот способ работает примерно с той же производительностью, что и сериализация, и в разы быстрее, чем var_export. Учитывайте пару ограничений: json_decode будет работать с ошибками, если в массиве больше 127 уровней и будет проблема с восстановлением объекта как, собственно, объекта. Но, я так понимаю, в вашем случае это не проблемы. Зато есть дополнительный плюс - json_encode даёт на выходе строку меньшего размера, чем serialize.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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