我必须获取一个表,该表包含数百万条具有两列的记录——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;
- 但这需要超过15秒的时间才能实现,这太长了,而且阵列并不是唯一的
- 我也可以创建一个以单词为键的数组,其中包含id数组作为键,这将解决唯一性问题,但整个结构肯定太大,无法在合理的时间内放入内存
- 我可以创建多达几条记录的数组,并不时执行
fwrite
,但话说回来,这些行不会是唯一的
我不想在数据库层上这样做——数据库逻辑越少越好,我也不想执行更多繁重的数据库操作。
否则我怎么能这样做?
我能够将结果以块的形式追加到字符串中,并偶尔将其写入文件,清除该字符串,从而将其加速到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
太频繁,或者字符串太长,会使执行时间更长,我想这取决于我的内存速度。