Этот ответ является примером того, как реализовать буфер (ограниченный массив в памяти) в вашем коде и, когда он заполнен, сбросить его содержимое на диск, в конце вы найдете огромный массив на диске в формате JSON.,Я использовал этот способ в ситуации, похожей на вашу, и получил отличный результат в отношении «использования памяти», но, как я уже говорил вам в комментариях, вам нужно переосмыслить, зачем вам нужен этот ОГРОМНЫЙ массив в первую очередь, и если есть способ избежатьпродолжайте.
с помощью этой функции сэкономит память, используемую вашим массивом $final_result
, и заменит ее строковым буфером $ final_result, но мы контролируем его использование памяти.Однако ваш массив $query_result
все равно будет занимать необходимую ему память.
Обратите внимание, что вам нужно изменить функцию так, как вам нужно, потому что я использовал ваши переменные, которые не определены в моем коде.
/**
* proccess the HUGE array and save it to disk in json format [element,element]
*
* @param string $fileName absulote file name path you want to save the proccessed array in
* @return int processed elements count
*/
function buildMyArrayInFile($fileName)
{
$flushCheckPoint = 100;// set the buffer size as needed, depending on the size of PHP allowed memory and average element size
$processedElements = 0;
$final_result = "[";
file_put_contents($fileName, "");//prepare the file and erase anything in it
foreach($query_result as $row)
{
$line_datas =explode(";",$row["linedata_0"]);
$linedata = [];
$final = [];
$d = [];
for($s =0; $s < count($line_datas); $s++){
$line_data = explode(",",$line_datas[$s]);
$d["timestamp"] = utf8_encode($line_data[0]);
$d["x"]= utf8_encode($line_data[1]);
$d["y"] = utf8_encode($line_data[2]);
array_push($linedata,$d);
}
$final["id"]= $row["id"];
$final["isActive"]= $row["isActive"];
$final["personId"]= utf8_encode($row["personId"]);
$final["name"] = NULL;
$final["gender"] = utf8_encode($row["gender"]);
$final["age"] = utf8_encode($row["age"]);
$final["linedata"]=$linedata;
$final_result .= json_encode($final) . ",";
$processedElements ++;
if($processedElements % $flushCheckPoint === 0){
//the array has reached the limit, flush the array to disk
file_put_contents($fileName, $final_result, FILE_APPEND);
$final_result = "";
}
}
$final_result = rtrim($final_result, ",");//trim the last comma
$final_result .= "]";
//flush the remaning data in $final_result
file_put_contents($fileName, $final_result, FILE_APPEND);
return $processedElements;
}
это еще одна простая версия функции для тестирования
// test
var_dump(buildMyArrayInFile2("/home/myuser/myArray.json"));
// outputs int(7)
function buildMyArrayInFile2($fileName)
{
$flushCheckPoint = 2;// set the buffer size as needed, depending on the size of PHP allowed memory and average element size
$processedElements = 0;
$final_result = "[";
file_put_contents($fileName, "");//prepare the file and erase anything in it
$test_result = [1,2,3,4,"wee","hello\nworld",5];
foreach($test_result as $row)
{
$final_result .= json_encode($row) . ",";
$processedElements ++;
if($processedElements % $flushCheckPoint === 0){
//the array has reached the limit, flush the array to disk
file_put_contents($fileName, $final_result, FILE_APPEND);
$final_result = "";
}
}
$final_result = rtrim($final_result, ",");//trim the last comma
$final_result .= "]";
//flush the remaning data in $final_result
file_put_contents($fileName, $final_result, FILE_APPEND);
return $processedElements;
}