2015-10-06 99 views
0

我想使用cakePHP框架將JSON文件(也可以CSV格式)插入到mySQL數據庫中。基本要求很明確,但周圍的要求很難:PHP將JSON/CSV與SQL數據庫相匹配(cakePHP)

  1. JSON/CSV文件很大(大約200 MB,最多200.000行)。
  2. 該文件包含幾個字段。這些字段需要映射到mySQL數據庫中具有不同名稱的字段。
  3. 該CSV包含一個名爲art_number的字段。該字段也存在於mySQL數據庫中。 art_number是唯一的,但不是mySQL中的主鍵。如果CSV和數據庫具有相同的art_number,我想更新mySQL記錄。如果不是,應該創建一個新的記錄。
  4. CSV文件的幾個字段在存儲之前需要處理。還需要添加其他字段。
  5. 該CSV包含一個image_URL。如果它是數據庫的新記錄(未知art_number),則應該複製,修改(使用imagick)該圖像並存儲在服務器上。
  6. 整個工作需要每天運行。

正如你可以看到有很多限制(內存,運行時等)。但我不確定如何從架構的角度來看待這個問題。例如。我應該首先嚐試將所有內容插入到單獨的「導入」數據庫表中,然後單獨運行這些步驟?從數據庫中將ID映射到CSV行的好方法是什麼?如果我能夠根據art_number映射ID,Cakephp能夠執行新建或更新現有記錄。另外改變和複製高達200.000的圖像似乎是一個大問題。那麼如何將它分解成更小的塊呢?

如果您能幫助您找到正確的策略,我將不勝感激。在記憶和速度方面我需要考慮什麼? Doe是否有意義將流程拆分成不同的工作? oyu會怎麼做?

+1

您的情況與_any_ csv導入過程有何不同?您可以使用[適當的功能](http://php.net/manual/en/function.fgetcsv.php)讀取文件,並一次處理一行數據。無論文件爲1行還是1百萬行,導入邏輯原則上都是相同的。首先使它成爲一行,然後使用[cli process](http://book.cakephp.org/3.0/en/console-and-shells.html)。 – AD7six

+0

感謝您的澄清。我是否有權假定PHP CLI腳本在運行時等方面沒有限制? – Gegenwind

回答

0

如果您能幫助您找到正確的策略,我將不勝感激。在記憶和速度方面我需要考慮什麼?

  • Use a shell爲進口
  • 的X線或數據以避免內存問題的X量Read the data in chunks,然後處理這些塊。這是一個簡單的循環。
  • 如果處理過程需要較長時間,請考慮使用像Resque這樣的作業隊列。如果需要,您可以將進度狀態更新爲用戶。

Doe坐下來是否有意義將流程拆分成不同的工作? oyu會怎麼做?

這取決於需求以及您的處理需要多長時間以及系統可以並行處理多少CPU,並且不會達到100%CPU使用率並有效減慢網站速度。如果發生這種情況,請將處理移至另一臺計算機或使用the nice command限制該進程的CPU使用率。

+0

謝謝你的鏈接和建議。因此,使用不受時間限制的CLI和逐行方法是一條路。我無法訪問我的服務器上的Cake Shell(共享主機環境)。我仍然希望腳本能夠在Cake Shell中訪問應用程序的其餘部分。但我認爲沒有理由不從本地機器運行腳本並更新遠程數據庫。使用某種FTP連接複製圖像應該不是什麼大問題(或者我希望...)。 – Gegenwind

+0

你可以做你的建議,但這是一個非常糟糕的解決方案。取而代之的是一個合適的主機有像Digital Ocean和VPS Cheap這樣的提供商提供*真正便宜的*虛擬根服務器。如果人們想要開展一項嚴肅的項目,但爲了適當的環境而花更多的錢花更少的錢,他們在一天結束時就不會付出更少的錢,因爲其他的事情將依賴於繁瑣的解決方案。所以我建議你的客戶端切換主機提供商。 – burzum

+0

很好的建議。目前,與主機提供商已經完成很多事情的環境遷移相關的努力似乎是一大步。但是你說得對,它不會因爲停留時間變長而變得更容易...... – Gegenwind