我必须获取一个包含两百万条记录的表,其中包含两列 - id
和name
,每个名称都进行一次爆炸操作,然后每个展开的元素一起保存到文件中它的ID。 id-keyword
对必须是唯一的。
这是最快,最节省内存的方法吗?
我一直在考虑这样的事情:
$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;
fwrite
,但是再次,这些行不会是唯一的。我不想在数据库层上执行此操作 - 数据库逻辑越少越好,我也不想执行更繁重的数据库操作。
我怎么能这样做?
答案 0 :(得分: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
或太长的字符串会使执行时间变长,我想这取决于我的记忆速度。