[英]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.