2015-12-14 92 views
0

我必須獲取一個包含兩列數千萬記錄的表格 - idname,對於每個名稱進行爆炸操作,然後將每個爆炸元素與其ID一起保存到文件中。 id-keyword對必須是唯一的。將mysql錶轉換爲數組

什麼是最快,最有記憶效率的方法呢?

我一直在思考這樣的事情:

$query = $pdo -> prepare('SELECT id, name FROM table'); 
$query -> execute(); 

$time = microtime(true); 

if (file_exists('test.txt')) { 
     unlink('test.txt'); 
} 
$fh = fopen('test.txt', 'a'); 
while ($result = $query -> fetch()) { 
     $tokens = explode(" ", $result['name']); 
     foreach ($tokens as $token) { 
      fwrite($fh, $result['id'] . ' ' . $token . PHP_EOL); 
     } 
} 
fclose($fh); 

echo microtime(true) - $time; 
  1. 但它需要在15秒內實現這一目標,這是方法來長,和數組是不是唯一的。
  2. 我還可以創建一個字作爲密鑰的數組,其中包含ID作爲鍵,這將解決uniqness問題的數組,但整體結構肯定會過大,以適應到內存,並在合理的時間。
  3. 我可以創建數組達到幾條記錄並不時地執行fwrite,但是再次,這些行不會是唯一的。

我不想在數據庫層上這樣做 - 數據庫邏輯越少越好,而且我也不想執行更重的數據庫操作。

我該怎麼辦?

+0

你爲什麼要炸開空間的名字?這就是你在文件中引入重複行的方式。請注意,在內部循環中甚至沒有使用'$ token'變量。你想要做什麼? – jeroen

+0

對不起,我犯了一個錯字,我編輯了代碼。我試圖從列名中獲取包含所有單個單詞的數組以及相應的名稱ID,而不重複。 – user99999

+0

我還是不明白你在做什麼;你可以很容易地過濾'$ tokens',這樣所有的id-word組合都將是唯一的(假設id是唯一的,以......開始),並且你可以跟蹤哪些記錄已經被處理,這樣你只需要做它曾經。 – jeroen

回答

0

我能夠以塊的形式追加結果字符串加快這對1,5s,並偶爾寫到文件,清除該字符串。

$query = $pdo -> prepare('SELECT id, name FROM table'); 
    $query -> execute(); 
    $fh = fopen('test.txt', 'a'); 
    $str = ''; 
    while ($result = $query -> fetch()) { 
      $tokens = array_unique(explode(" ", $result['name'])); 
      foreach ($tokens as $token) { 
        $str .= $result['id'] . " " . $token . "\n"; 
      } 
      if (strlen($str) > 5000) { 
        fwrite($fh, $str); 
        $str = ''; 
      } 
    } 
    fclose($fh); 

過於頻繁fwrite的,或過長的字符串,使執行時間越長,我想這取決於我的記憶速度。