2013-03-18 63 views
0

在一個文件夾中我有34,000個配置文件。每個文件都包含一個具有唯一配置規範的對象。下面是一個文件內容的例子:使用PHP如何將1000個配置文件加載到數據庫中?

$obj = new obj(); 
$obj->name = "name": 
$obj->location "nyc"; 
... 
... 
etc 

每個文件大約100到200行,大小約17k。

要獲得這些到數據庫中,我有以下功能:

function retrieve_files(){ 
    $objs = array(); 

    $path = 'filefolder'; 

    //retrieve a list of files as an array of objects 
    $files = get_files('/\.inc$/', $path, 'filename', 0); 

    foreach ($files as $file) { 
      include_once $path.'/'.$file->filename; 
      $objs[$obj->name] = $obj; 
    } 

    return $objs; 
} 

一旦返回的對象數組,它環繞在另一個函數,系列化,每個被保存到數據庫中。

目前,我的服務器是一個英特爾雙核3.06 Ghz處理器與8 Gig的RAM。我在Ubuntu 12.04中通過命令行運行腳本。

由於該腳本處理CPU最大值爲100%,並且內存不斷攀升,直到所有8個演出已最大化。該腳本然後崩潰。

如何讓這個腳本或整個過程更高效?最好我寧願留在這個函數的範圍內。我也希望一次完成。有沒有一種方法來重構這個使用較少資源或釋放資源的陣列創建和循環迭代?

回答

0

而不是返回所有的對象,它一次說100個對象。所以像這樣的東西

function retrieve_files(){ 
    $objs = array(); 

    $path = 'filefolder'; 

    //retrieve a list of files as an array of objects 
    $files = get_files('/\.inc$/', $path, 'filename', 0); 
    $count = 0; 
    foreach ($files as $file) { 
      include_once $path.'/'.$file->filename; 
      $objs[$obj->name] = $obj; 
      if ($count++%100 == 0) 
      { 
       function_to_process_obj($objs); 
       $objs = null; 
       $objs = array(); 
      } 
    } 
} 
0

很明顯,在第一個函數結束時,在最終數組中有太多對象。

34 000個文件意味着您的陣列中有34 000個對象$objects

也許你應該將對象保存在循環中。對於包含的每個文件,您將序列化對象保存在數據庫中。 DB中有1行配置文件。

相關問題