我有一个问题,所以我的.csv
"product";"date";"q"
"8";"1995-05-01";"4"
"8";"1995-05-01";"2"
"8";"2001-05-01";"13"
"8";"2001-05-01";"3"
"9";"1995-05-01";"1"
我大约有100万行。 我正在做这样的事情:
while (($row = fgetcsv($fpointer, 4096, ";")) !== false) {
$data[$row[0]][$row[2]][] = $row;
}
但是此过程会占用大量内存。我该怎么办?请帮助我。
答案 0 :(得分:1)
这是因为您使用的内存超出了内存限制,请不要读取所有内存,然后在处理非常大的数据集时进行处理。您可以循环处理批量数据,例如:
$limit = 0;
$data = [];
while($row = fgetcsv($fpointer, 4096, ";")) {
$limit++;
$data[$row[0]][$row[2]][] = $row;
if (1000 <= $limit) {
// process your data
$data = [];
$limit = 0;
}
}
答案 1 :(得分:0)
SplFileObject
允许您逐行读取,指定大小(SplFileObject::fread
)等,而无需将整个文件加载到内存中。
我测试的文件大小最大为3.5GB
,没有任何问题。