2015-12-14 32 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的,或过长的字符串,使执行时间越长,我想这取决于我的记忆速度。