Чтение в 738627 записей через обычный файл дает ошибку исчерпания памяти - PullRequest
0 голосов
/ 20 июля 2010

Я пытаюсь прочитать в простом плоском файле, в нем 738 627 записей, пример файла выглядит так:

#export_dategenre_idapplication_idis_primary
#primaryKey:genre_idapplication_id
#dbTypes:BIGINTINTEGERINTEGERBOOLEAN
#exportMode:FULL
127667880285760002817317350
127667880285760002818261461
127667880285760002825372301
127667880285760002827785570
127667880285770193778591110
127667880285770193778771240
127667880285770193779116230
127667880285770193779482590
127667880285770193779623800
127667880285770193780516840
#recordsWritten:738627

Мой соответствующий код PHP выглядит следующим образом

 ini_set("memory_limit","40M"); 
$fp1 = fopen('genre_application','r');
if (!$fp) {echo 'ERROR: Unable to open file.'; exit;}

$loop = 0;
while (!feof($fp1)) {
  $loop++;
    $line = stream_get_line($fp1,128,$eoldelimiter); //use 2048 if very long lines
if ($line[0] === '#') continue;  //Skip lines that start with # 
    $field[$loop] = explode ($delimiter, $line);
list($export_date, $genre_id, $application_id, $is_primary ) = explode($delimiter, $line);

// does application_id exist? 
$application_id = mysql_real_escape_string($application_id); 
$query = "SELECT * FROM jos_mt_links WHERE link_id='$application_id';"; 
$res = mysql_query($query); 
if (mysql_num_rows($res) > 0) { 
 echo $application_id . "application id" . $link_id . "\n";
} else 
{
// no, application_id doesn't exist 
echo $loop . "\n";
}

} //close reading of genre_application file
fclose($fp1);

Последний вывод на моем экране выглядит следующим образом, поэтому он даже не проходит первые 100,00 записей.Есть ли способ предотвратить исчерпание памяти сценарием?

81509
81510
81511
81512
81513
81514
81515
81516

Неустранимая ошибка PHP: исчерпан допустимый объем памяти 41943040 байт (попытался выделить 14 байт) в / var / www / vhosts/smartphonesoft.com/httpdocs/fred/xmlfeed/test/text_to_mysql.php в строке 156

Неустранимая ошибка: допустимый объем памяти 41943040 байт исчерпан (попытка выделить 14 байт) в / var / www / vhosts /smartphonesoft.com/httpdocs/fred/xmlfeed/test/text_to_mysql.php в строке 156

Ответы [ 5 ]

2 голосов
/ 20 июля 2010

Похоже, вы храните каждую строку в массиве, инициализированном вне сценария, который вы цитируете:

 $field[$loop] = explode ($delimiter, $line);

почему?Это будет расти с каждым циклом, пока не будет достигнут предел в 40 МБ.

Я думаю, что это сработает, если вы удалите это или измените его на $field = ....

0 голосов
/ 21 июля 2010

Где у вас есть ...

$res = mysql_query($query);

Разве ты не должен был? ...

if (isset ($res))
{
    mysqli_free_result ($res);
}

$res = mysql_query($query);
0 голосов
/ 20 июля 2010

Вы можете увеличить объем доступной памяти следующим образом: ini_set("memory_limit","64M"); ... просто поместите это в верхнюю часть вашего PHP-файла.Если памяти все еще недостаточно, увеличьте ее до 128 или 256 мегабайт.

Однако в вашем конкретном случае вы не используете доступную память эффективно ... см. Ответ Пекки.

0 голосов
/ 20 июля 2010

Вы как бы отвечаете на свой вопрос ... Вы хотите сохранить в памяти 738 627 массивов текста.Есть ли причина, по которой вы держите все разнесенные строки в поле $?

0 голосов
/ 20 июля 2010

Вы заполняете $ field [$ loop] для каждой строки, прочитанной из файла, поэтому этот массив увеличивается с каждой итерацией цикла.Вы действительно нуждаетесь в этом росте в памяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...