小型服务器上的大内存使用量(优化问题)

时间:2009-10-07 05:02:07

标签: php performance memory

我有一个应用程序,它分析由我们的核心系统生成的输入文件中的数据。根据客户端的不同,该文件的大小可能会有所不同(文件包含在线营销指标,如点击次数,展示次数等)。我们的一个客户拥有一个获得相当大流量的网站,生成的指标文件大小约为3-4兆字节。此应用程序目前一次分析三个文件,每个文件是不同的时间聚合。

我正在使用CSV迭代器读取文件,并将整个文件的内容存储到多维数组中。其中一个特定文件的数组长约16000个元素,每个子数组为31个元素。处理加载此数据的数据处理器对象使用大约50MB的内存。目前,PHP内存限制设置为100MB。不幸的是,这个应用程序所使用的服务器很旧,无法处理大量的内存增加。

所以这让我想到了一个问题:如何优化处理这么大的文件?

可能的优化是读取文件的某些部分,计算,存储,重复吗?

3 个答案:

答案 0 :(得分:1)

您可以一次修改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);
}

答案 1 :(得分:0)

你走在正确的轨道上。如果可能的话,读一行,做你需要做的任何事情(计算你正在计算的数量等),然后丢弃该行。

请参阅fgets()

的示例

答案 2 :(得分:0)

为什么不直接逐行读取文件... - >读线 - >存储您需要的内容,更新您的统计信息 - >阅读下一行等等。