我有一个应用程序,它分析我们的核心系统生成的输入文件中的数据。根据客户的不同,该文件的大小可能会有所不同(文件包含在线营销指标,如点击量、印象等)。我们的一个客户有一个网站,它获得了相当大的流量,生成的指标文件大小约为3-4兆字节。这个应用程序目前一次分析三个文件,每个文件是一个不同的时间集合。
我使用CSV迭代器读入文件,它将整个文件的内容存储到一个多维数组中。其中一个特定文件的数组大约有16000个元素长,每个子数组有31个元素。处理加载此数据的数据处理器对象使用了大约50MB的内存。目前,PHP内存限制设置为100MB。不幸的是,此应用程序所在的服务器太旧,无法处理大量的内存增加。
因此,这就引出了一个问题:如何优化处理这种大小的文件?
可能的优化是读取文件的一部分,计算,存储,重复吗?
发布于 2009-10-07 05:24:54
您可以修改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);
}发布于 2009-10-07 05:20:20
你在正确的轨道上。如果可能的话,读一行,对它做你需要做的任何事情(计数,等等),然后丢弃这行。
请参阅fgets()的示例
发布于 2009-10-07 05:22:50
为什么不简单地逐行阅读文件...->读取行->存储你需要的东西,更新你的统计数据->读下一行,等等。
https://stackoverflow.com/questions/1529563
复制相似问题