我正在開發基於Symfony 2的項目,需要使用cron任務定期從.csv文檔導入150萬個產品。在Symfony 2中導入大型數據集
進口目前看起來是這樣的:
...
Propel::disableInstancePooling();
$fp = fopen($file, 'r');
while (!feof($fp)) {
$line = fgets($fp, 2048);
$data = str_getcsv($line, "\t");
$product = new Product();
$product->setId($data[0]);
$product->setTitle($data[1]);
...
$product->save();
}
...
約5分鐘後然而阿帕奇達到其512MB的內存分配,並引發以下錯誤:
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 78 bytes) in /var/www/vhosts/myapp.local/app/cache/dev/classes.php on line 9451
我已禁用的Propel的實例池(這在以前Propel在其他框架中支持導入過程中工作過),問題仍然存在,所以我想知道Symfony 2是否正在執行任何類型的緩存(基於錯誤存在拋出)。
有沒有人在Symfony 2中執行大量進口的任何經驗可以讓我指出正確的方向?
好吧,我將看看在MySQL級別導入它。這種數據導入的大小對我來說是新的領域。您理所當然地提到,PHP不是針對此級別的數據進行修補程序的最佳語言。你會建議我看看Python作爲替代嗎?謝謝。 –
這取決於。只要你預處理數據(如果你沒有像mysql的sql語句那樣以本地格式接收它),並且你在資源消耗方面非常小心(所以你沒有耗盡內存),你可以將數據轉換成一種mysql可以理解的格式。一種方法是從文件中讀取前x行,將生成的sqls轉儲到文件中。繼續閱讀,直到完成整個文件。一旦你有了sql,讓mysql客戶端做它的工作。它會比你做的更快。但要小心,測試你的腳本。由於腳本不佳,我看到數據丟失太多。 – Xnoise
老實說,我不知道如果python更好,或c更好,或任何其他語言。你只需要注意資源並明智地使用它們。 MySQL客戶端會最多做其餘的事情。 – Xnoise