如何在不使用数据库的情况下处理大量数据?

时间:2013-05-28 01:41:52

标签: php arrays highstock

我正在将365 csv文件中的数据加载到highstock图形api中。我正在使用PHP来读取csv文件并创建数组来保存信息。但是我遇到了:

  

致命错误:允许的内存大小为67108864字节耗尽

我该如何解决这个问题?


希望创建此图表:

  

http://www.highcharts.com/stock/demo/compare

1 个答案:

答案 0 :(得分:2)

不要将内存中的所有内容都表示为数组,而是直接使用json文件。我将假设您需要的数据是一个二维多维数组,其中包含时间戳+6个浮点字段。

如果不了解有关如何将信息提供给图表API的详细信息,请参阅此处。

$tmpFile = tempnam("tmp/","highchart_");
$out = fopen($tmpFile, "w");
// we are not going to use json encode because it requires us to hold the array in memory. 
fputs($out, "[");
for($i=0;$i<count($files);$i++){
    if (($handle = fopen($files[$i], "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            // You may be able to get arround the timestamp calculation by just saying
            $timestamp = strtotime($data[0]." ".$data[1]);
            fputs($out, "[".(int)$timestamp.",".(float)$data[2].",".
                            (float)$data[3].",".(float)$data[4].",".(float)$data[5].",".(float)$data[13]."]");
        }
        fclose($handle);
    }
}
fputs($out, "]");
fclose($out);

现在$tmpFile的文件将包含一个json编码的数组,然后您可以使用readfile或fpassthru来访问浏览器。另外,我建议您使用某种缓存机制,而不是仅将它们存储在临时文件中。 + 67MB的数据对于每个请求都是非常强大的。