我有一个应用程序,它分析由我们的核心系统生成的输入文件中的数据。根据客户端的不同,该文件的大小可能会有所不同(文件包含在线营销指标,如点击次数,展示次数等)。我们的一个客户拥有一个获得相当大流量的网站,生成的指标文件大小约为3-4兆字节。此应用程序目前一次分析三个文件,每个文件是不同的时间聚合。
我正在使用CSV迭代器读取文件,并将整个文件的内容存储到多维数组中。其中一个特定文件的数组长约16000个元素,每个子数组为31个元素。处理加载此数据的数据处理器对象使用大约50MB的内存。目前,PHP内存限制设置为100MB。不幸的是,这个应用程序所使用的服务器很旧,无法处理大量的内存增加。
所以这让我想到了一个问题:如何优化处理这么大的文件?
可能的优化是读取文件的某些部分,计算,存储,重复吗?
答案 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)
为什么不直接逐行读取文件... - >读线 - >存储您需要的内容,更新您的统计信息 - >阅读下一行等等。