簡體   English   中英

通過平面文件讀取738627記錄會導致內存耗盡錯誤

[英]Reading in 738627 records via flat file gives memory exhaustion error

我正在嘗試讀取一個簡單的平面文件,其中有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致命錯誤:在第156行上的/var/www/vhosts/smartphonesoft.com/httpdocs/fred/xmlfeed/test/text/to_mysql.php中,耗盡了41943040字節的允許內存大小(嘗試分配14字節)

致命錯誤:在第156行上的/var/www/vhosts/smartphonesoft.com/httpdocs/fred/xmlfeed/test/text/to_mysql.php中,已用完41943040字節的內存容量(嘗試分配14字節)

您似乎將每一行存儲在引用腳本之外初始化的數組中:

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

為什么? 這必然會隨着每個循環而增長,直到達到40MB的限制。

我認為,如果您刪除了它或將其更改為僅$field = ... ,那將是可行的。

您正在為從文件讀取的每一行填充$ field [$ loop],因此此數組在循環的每次迭代中都在增長。 您是否真的需要內存增加?

您可以回答自己的問題...您想將738,627個文本數組存儲到內存中。 您是否將所有分解線都保留在field $中有原因嗎?

您可以像這樣增加可用內存量: ini_set("memory_limit","64M"); ...只需將其放在您的PHP文件的頂部即可。 如果仍然沒有足夠的內存,則將其增加到128或256兆。

但是,在您的特定情況下,您沒有有效地利用可用內存...請參閱Pekka的答案。

你在那里...

$res = mysql_query($query);

你不應該有嗎?

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

$res = mysql_query($query);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM