Php 如何在不使用数据库的情况下处理大量数据?
我正在将365个csv文件中的数据加载到highstock图形api中。我使用PHP读取csv文件并创建数组来保存信息。然而,我遇到了以下问题: 致命错误:已耗尽67108864字节的允许内存大小 我如何解决这个问题Php 如何在不使用数据库的情况下处理大量数据?,php,arrays,highstock,Php,Arrays,Highstock,我正在将365个csv文件中的数据加载到highstock图形api中。我使用PHP读取csv文件并创建数组来保存信息。然而,我遇到了以下问题: 致命错误:已耗尽67108864字节的允许内存大小 我如何解决这个问题 希望创建此图表: 与其将内存中的所有内容都表示为数组,不如直接使用它访问json文件。我将假设您需要的数据是一个包含时间戳+6个浮点字段的二维多维数组 在不知道如何将信息提供给图表api的很多细节的情况下,这里是第一个尝试 $tmpFile = tempnam("tmp/","
希望创建此图表:
与其将内存中的所有内容都表示为数组,不如直接使用它访问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=tempnam(“tmp/”、“highchart_389;”);
$out=fopen($tmpFile,“w”);
//我们不打算使用json编码,因为它需要我们将数组保存在内存中。
FPUT($out,“[”);
对于($i=0;$ii)在您提供正在解决的实际任务之前,不可能提供解决方案。PS:“允许php分配更多内存并在服务器上安装更多内存”算是一个答案吗?@zerkms你是什么意思?我的意思是-除非给出彻底的任务解释,否则不可能提供优化建议。优化中没有银弹,每种情况都是独一无二的。PS:不过有经验法则,比如:尽可能少地将数据保存在内存中,并在不需要时尽快删除nymoreOk,那么你只需要更多关于我的案例的信息吗?@Willow:一个csv是否可以放入内存?你可以一个接一个地向API发送请求吗?这样你就可以读取/处理一个csv,发送一个请求,unset()
所有数组,并对第二个数组重复相同的操作,依此类推?您发布的示例附带的JSFIDLE上的jabber使用了json。按照我的结构方式,在连接到浏览器时,没有多余的空格会占用带宽。readfile($tmpFile);
readfile为php创建一个直接从输入文件到输出缓冲区的管道,这样它就不会超出您的内存…只要确保您不在ob_start块中,并且应该没有内存问题。这意味着您不能写入/tmp/
在服务器上留出一个允许apache写入和替换的位置tmpname调用中的路径前缀,因此您需要在Web空间中创建一个目录,并授予它读写和执行权限。(我会将其设置在托管此php文件的位置旁边)。然后您可以将tmpname调用更改为readtempnam(uu DIR./highchart);
这将使其成为Web服务器的位置(运行php的人)尝试写入这些文件,但它将拥有这样做的权限。大量的unset()
在这里是多余的。您可以删除它们,但不会有任何更改。