所以在遇到內存限制後,我複製了the following code。處理限制爲一行的大csv文件
它工作得很好。我現在唯一的問題是在處理csv文件的情況下,結構限制基於塊的大小,但這意味着它可能會在中途切斷一行。
我能做些什麼來確保何時創建一個塊,它最終到達/ n。
所以在遇到內存限制後,我複製了the following code。處理限制爲一行的大csv文件
它工作得很好。我現在唯一的問題是在處理csv文件的情況下,結構限制基於塊的大小,但這意味着它可能會在中途切斷一行。
我能做些什麼來確保何時創建一個塊,它最終到達/ n。
你可以先嚐試設置內存限制:
ini_set('memory_limit', '32MB');
之後,在一次讀取一行:
$handle = fopen("inputfile.csv", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
} else {
// error opening the file.
}
fclose($handle);
基於您的代碼示例,這將給:
function file_get_contents_chunked($file,$chunk_size,$callback)
{
$handle = fopen($file, "r");
$i = 0;
if ($handle) {
while (($line = fgets($handle)) !== false) {
call_user_func_array($callback,array($line,&$handle,$i));
$i++;
}
} else {
return false;
}
fclose($handle);
return true;
}
請注意,$ chunk_size參數不再需要了...因此,如果需要,可以將其刪除。
也可以使用該功能來讀取由線SAV文件行:
fgetcsv(file,length,separator,enclosure);
實施例1
<?php
$file = fopen("contacts.csv","r");
print_r(fgetcsv($file));
fclose($file);
?>
CSV文件:
Kai Jim, Refsnes, Stavanger, Norway
Hege, Refsnes, Stavanger, Norway
的輸出以上代碼將爲:
Array
(
[0] => Kai Jim
[1] => Refsnes
[2] => Stavanger
[3] => Norway
)
我很想知道別人在做什麼。
我改變了限制,以基於一定數量的行來讀取,而不是大小限制。我沒有使用fread,而是使用fgets來獲得整條線。 再次,這一切都來自問題中鏈接的代碼。
<?php
function file_get_contents_chunked($file,$chunk_size,$callback)
{
try
{
$handle = fopen($file, "r");
$i = 0;
$x = 0;
$chunk = array();
while (!feof($handle)) {
while ($row = fgets($handle)) {
// can parse further $row by usingstr_getcsv
$x ++;
$chunk[] = $row;
if ($x == $chunk_size) {
call_user_func_array($callback, array($chunk, &$handle, $i));
unset($chunk);
$x = 0;
}
}
}
fclose($handle);
}
catch(Exception $e)
{
trigger_error("file_get_contents_chunked::" . $e->getMessage(),E_USER_NOTICE);
return false;
}
return true;
}
?>
//修正了我的實際意圖,限制通過線的X量
其有趣......我們最終在同一時間得到了相同的答案(4分鐘的差距)......除了一會兒! feof ...這是不需要的fgets php手冊中指定的...我想添加它,但後來查找它,以確定是否需要它。讓我們看看別人會想出什麼! – Graben 2014-09-28 04:45:52
我仍然在審查我的更改,因爲它沒有按照我的想法去做。我希望指定閱讀x行數量,但目前似乎沒有這樣做。 – Pat 2014-09-28 04:51:29
我很好奇,爲什麼你會限制線的數量,因爲他們每行處理線,所以你需要確保每條線對於可用內存來說都不是太大......最後,我很確定op想讓整個文件處理不了? – Graben 2014-09-28 15:00:50
當你正在處理的塊中的行,當你遇到的最後一行,只要執着於的內容最後一行並將其添加到下一個塊的前面,以便處理該行。當沒有更多的塊時,只處理最後一行。 – 2014-09-28 04:13:33