Подскажите, как умнее поступить в следующей ситуации... На своем локальном компьютере с помощью РНР делаю выборку из большого количества файлов и необходимые мне данные сохраняю в файл. Выборка длится несколько минут, а файл получается большой, до 50 МБ. Компьютер откровенно перегружается. Вот хотел спросить, как лучше поступить: заганять эти 50 МБ в переменную, а потом ее сохранять в файл или очень много раз открывать файл и сохранять в него полученные данные по мере поступления (при файле 50 МБ придется открывать, дописывать и закрывать его около 5 млн. раз).
Я делаю поиск и выборку нужных мне данных из большого количества имеющихся файлов и сохраняю эти данные в один файл, который уже будет использоваться дальше.
Нет смысла записывать в файл 2 байта, но и не нужно держать в памяти 10 мегабайт. Буфер в 4кб-1мб вполне подойдет.
Спасибо. Не буду в крайности впадаться и сделаю нечто среднее: буду по пол метра накапливать в переменную, а потом сбрасывать информацию с нее в файл.
При записи в файл PHP использует буфера вывода. Каждый раз закрывая файл сбрасываете буфера вывода. ЗАЧЕМ 5 млн. раз открывать и закрывать файл? Откоройте 1 раз. 5 млн. раз допишите в файл. Закройте 1 раз. НЕ надо php делает это за вас.
А ничего страшного, что файл в таком открытом состоянии будет около 5 минут? Сбои не будут происходить если вдруг антивирус или файловый менеджер будут мониторить папку с файлом? Это наверно что-то слишком редкое и сложное? Там даже коментов нет.
все будет впорядке это совершенно стандартная вещь. Повторять буфер руками - дикие костыли. комментировать то нечего.
блудный сын файлы открытыми висят сутками и неделями, и ничего, живы, важно только правильно открыть его. другое дело, что будет с тем, кто его попытается открыть...
Хорошо. Подскажите тогда как это в коде примерно будет выглядеть? Потому что проблема реальная. У меня таких больших файлов с выборкой должно быть больше 150 штук. Когда я накапливаю данные в переменную и вывожу их в барузер через Оперу, то например для файла в 18МБ у меня вывод занимает около 3х минут. Когда же я пытаюсь накапливать в переменную примерно по 300кБ, а потом накопленное дописывать в файл и обнулять ее, то такой вывод занимает около 7 минут. Вот что странно. А этот файл ведь не самый большой. Времени придется уйму потратить. Каким способом быстрее можно создать большой файл?
Ага, быстрее стало. Минуты 1,5 заняло времени. Но писал не по 4 кБ, а по мере появления данных (где-то по 10 символов). Спасибо! Я раньше обычно как только произошла запись в файл, сразу же его закрывал. Потом опять открывал. Наверно это много времени отнимало. Но раз можно долго держать файл открытым, то токая скорость меня в принципе устраивает.