簡體   English   中英

在while循環中添加到數組時,PHP凍結

[英]PHP freezes when adding to array in while loop

我有一個包含兩列的260k行csv文件。 我已經使用fgetcsv讀取了csv文件,並且有一個while循環可以讀取文件中的每一行。 在循環中,我嘗試將第二列中的值添加到數組中。

當我將一行添加到數組中時,我的PHP凍結並且沒有完成。 我已經完成調試,並且值已添加到數組中,所以我知道添加到數組和while循環可以工作,但我不知道為什么凍結。

如果我刪除該行,則while循環將完成260k行,然后處理文件的其余部分。

這是我的代碼:

$amountRecords = 0;
$totalValue = 0;
$valueArray = array();

// reads in csv file
$handle = fopen('Task1-DataForMeanMedianMode.csv', 'r');
// to skip the header names/values
fgetcsv($handle);

// creates array containing variables from csv file
while(($row = fgetcsv($handle, "\r")) != FALSE)
{

    /*
    echo "ROW CONTAINS: ";
    var_dump($row[1]);
    echo "<br />";
    */

    $valueArray[] = $row[1];

    /*
    echo "VALUEARRAY NOW CONTAINS: ";
    var_dump($valueArray);
    echo "<br />";
    */

    $totalValue = $totalValue + $row[1];
    $amountRecords++;

}

和csv文件示例:

ID,Value
1,243.00
2,243.00
3,243.00
4,243.00
5,123.11
6,243.00
7,180.00
8,55.00
9,243.00
10,55.00

出現內存不足錯誤時,有兩種通用方法。 像往常一樣,通過這些選擇,您可以選擇容易但錯誤的選擇和困難但正確的選擇。 一個簡單但錯誤的解決方案是將您的內存限制增加到適當的水平:

ini_set('memory_limit', '64M');

更好(雖然更難)的解決方案是重新設計算法,以不需要那么多的內存。 顯然,這是一種更可持續,更強大的方法。 為了正確執行此操作,您將需要評估您要構建的陣列需要執行的操作。 例如,我編寫了類似的腳本,將行導入數據庫。 我沒有建立一個巨大的數組然后插入,而是分批完成了,在這里我建立了一個50-100行的數組,然后插入並清除了該數組(釋放了內存以供重復使用)。

偽代碼:

for(each row in file) {
  $rows_cache[] = $row[1];
  if(count($rows_cache) >= 50) {
    insert_these($rows_cache);
    $rows_cache = array();
  }
}

您的第一行是字符串,也許嘗試添加

while(($row = fgetcsv($handle, "\r")) != FALSE)
{

    if(is_numeric($row[1]))
    { 
        $valueArray[] = $row[1];

        $totalValue = $totalValue + $row[1];
        $amountRecords++;
    }
}

為什么不下線:

$totalValue = $totalValue + $row[1];

從循環內部,而是使用:

$totalValue = array_sum($valueArray);

完成循環后

並不是真正的問題,但是

while(($row = fgetcsv($handle, "\r")) != FALSE)

可以改寫成

while($row = fgetcsv(...)) 

代替。 不需要顯式的錯誤檢查-如果fgetcsv返回false,則while循環將終止。 另外,此版本更清晰易讀,而且沒有風險。 如果您忘記了fget部分周圍的() ,則將進行$row = (fgetcsv() != false)的等效操作,並只是獲取一個布爾值。

暫無
暫無

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

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