У меня проблема с утечкой памяти в этом коде. То, что я пытаюсь сделать, - временно загрузить довольно большой файл CSV (не менее 12 тыс. Записей) и проверить каждую запись для частичного дублирования других записей в файле CSV. Причина, почему я говорю «частичное дублирование», состоит в том, что в основном, если большинство записей совпадают (по меньшей мере 30 полей), это будет дубликат записи. Код, который я написал, теоретически должен работать так, как предполагалось, но, конечно, это довольно большой цикл и исчерпывает память. Это происходит в строке, содержащей «array_intersect».Проверка частичного дублирования в CSV в PHP
Это не для чего-то, за что мне платят, но это помогает нам облегчить жизнь на работе. Я сотрудник, занимающийся вводом данных, и сейчас мы должны смотреть на дубликаты записей вручную, что является asinine, поэтому я пытаюсь помочь, создав небольшую программу для этого.
Большое вам спасибо!
if (isset($_POST["submit"])) {
if (isset($_FILES["sheetupload"])) {
$fh = fopen(basename($_FILES["sheetupload"]["name"]), "r+");
$lines = array();
$records = array();
$counter = 0;
while(($row = fgetcsv($fh, 8192)) !== FALSE) {
$lines[] = $row;
}
foreach ($lines as $line) {
if(!in_array($line, $records)){
if (count($records) > 0) {
//check array against records for dupes
foreach ($records as $record) {
if (count(array_intersect($line, $record)) > 30) {
$dupes[] = $line;
$counter++;
}
else {
$records[] = $line;
}
}
}
else {
$records[] = $line;
}
}
else {
$counter++;
}
}
if ($counter < 1) {
echo $counter." duplicate records found. New file not created.";
}
else {
echo $counter." duplicate records found. New file created as NEWSHEET.csv.";
$fp = fopen('NEWSHEET.csv', 'w');
foreach ($records as $line) {
fputcsv($fp, $line);
}
}
}
}
Так что скрипт делает запустить из памяти, да? –
, если вы его не убьете, следующая вещь, вероятно, приведет к ограничению времени выполнения – RiggsFolly
Какое фактическое сообщение об ошибке вы получаете? – RiggsFolly