簡體   English   中英

在PHP中處理大量非常大的文件

[英]Working with a large amount of really large files in PHP

我有一堆看起來像這樣的文本文件:

987654 Example 1
321987 Test 2
654321 Whatever 1

每列代表一個特定值(例如,ID,​​時間戳,名稱等)。 我正在嘗試將所有這些都匯集到MySQL表中。 我需要分別閱讀這些文件的每一行,並分析每一行的哪一部分應該放入該行的哪一列。

每個文件包含大約5,000,000行。 我試圖用這個做一個測試:

$test = array();
for($i=1;$i<5000000;$i++){
  $test[] = '';
}

即使是一個包含這么多元素的空白數組,也會使我的內存限制最大(64mb,它也需要保持在該限制,因為我的主機不允許更大的東西),因此將文件變成數組是不可能的,並且可能有點愚蠢。回想一下。 我不在這里,因為我以前從未做過這樣的事情。

如何在不使用數組的情況下執行文件中的foreach行之類的操作?

查看MySQL內置的LOAD DATA INFILE語句是否不適合您。

如果沒有,則可以使用PHP SplFileObject類來遍歷文件行,而無需將所有文件行都加載到內存中。 它具有解析SplFileObject::fgetcsv()行的特定方法,例如SplFileObject::fgetcsv()SplFileObject::fscanf() 在這種情況下,您可能希望使用PDO來讓MySQL事務一次提交所有插入語句,以加快導入過程或在出現問題時回滾所有插入語句。

我同意sectus,執行LOAD DATA INFILE ,然后讓MySQL做一些骯臟的工作。

如果您絕對需要使用php,則另一種方法是使用某種“並行處理”, 因此SO Question對此有更多信息。

如果決定使用php方法,則應使用fgets逐行閱讀,然后將每一行大塊丟給要處理的不同線程。 這樣,您就不會吃掉允許的內存,而應該在更短的時間內完成工作。

對於此類大文件,如果文件正確分隔,則需要bigdump腳本。 它易於使用,非常有效且快速。 我用它將這樣的大文件導入mysql。 大轉儲

暫無
暫無

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

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