Большое использование памяти на маленьком сервере (вопрос по оптимизации) - PullRequest
0 голосов
/ 07 октября 2009

У меня есть приложение, которое анализирует данные из входных файлов, сгенерированных нашей основной системой. В зависимости от клиента этот файл может различаться по размеру (файлы содержат показатели интернет-маркетинга, такие как клики, показы и т. Д.). У одного из наших клиентов есть веб-сайт, который получает довольно большой объем трафика, а размер метрических файлов составляет около 3-4 мегабайт. В настоящее время это приложение анализирует три файла за раз, каждый из которых представляет собой отдельный агрегат времени.

Я читаю в файле с помощью итератора CSV, и он хранит содержимое всего файла в многомерном массиве. Массив для одного из конкретных файлов имеет длину около 16000 элементов, каждый подмассив состоит из 31 элемента. Объект обработки данных, который обрабатывает загрузку этих данных, использует около 50 МБ памяти. В настоящее время ограничение памяти PHP составляет 100 МБ. К сожалению, сервер, на котором установлено это приложение, является старым и не может справиться с большим увеличением памяти.

Так что это подводит меня к вопросу: как я могу оптимизировать обработку файла такого размера?

Может ли возможная оптимизация считывать части файла, вычислять, хранить, повторять?

Ответы [ 3 ]

1 голос
/ 07 октября 2009

Вы можете изменить CSVIterator и читать части файла за раз или строку за раз.

$handle = fopen("/tmp/inputfile.txt", "r");
if ($handle) {
  while(!feof($handle)){
    $buffer = fread($handle, 4096);
    echo $buffer;
  }
}

или

$handle = fopen("/tmp/inputfile.txt", "r");
if ($handle) {
  while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
  }
  fclose($handle);
}
0 голосов
/ 07 октября 2009

Почему бы просто не прочитать файл построчно ... -> читать строку -> хранить то, что вам нужно, обновить статистику -> читать следующую строку и т. д.

0 голосов
/ 07 октября 2009

Вы на правильном пути. Если это вообще возможно, прочитайте строку, сделайте все, что вам нужно сделать (считая все, что вы считаете, и т. Д.), А затем отбросьте строку.

См. Пример для fgets ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...