我有一个非常大的表,我想用PHP逐行处理。
以下是我尝试过的:
PDO::fetchAll()
立即加载内存中的所有行:内存不足错误。PDO::fetchAll()和LIMIT X, 1000进行分组(即将大型查询拆分为较小的查询)
我惊讶地发现,内存的使用一直在持续增长,直到内存耗尽(至少一直到1Gb)。为什么在查询之间没有释放内存?
我没有全局变量,没有类/对象属性,分页被封装在一个方法中,因此本地变量(从db获取的行)应该在当前页面被…处理后由垃圾收集器收集。我也不将行存储在内存中,而是将其写入磁盘。
此外,这种技术的缺点是,它导致了几个查询,而不是一个查询,在非常大的表上,查询速度很慢。PDO::fetchAll()与buffered queries
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,真);
最后,内存使用率很低(~13 as ),但是进程非常慢,因为每一行都意味着对MySQL服务器的网络访问。所以我的问题是:
还是你看到了另一个更好的解决方案?
发布于 2015-01-20 12:15:41
也许我不明白你的问题..。但是,我创建了一个简单的脚本,用~ 5,436,226行(和19列)迭代表中的所有值,并将其保存到out文件中。我使用的是PostgeSQL而不是MySQL (但我不认为这是一个问题,您必须只更改限制部分)。
<?
ini_set('memory_limit', '100M');
$pdo  = new PDO('pgsql:host=localhost;port=5432;dbname=test', 'postgres', 'postgres');
$page = 0;
while ($pdo) {
    echo ($page++).PHP_EOL;
    $stmt = $pdo->prepare('SELECT * FROM table ORDER BY id LIMIT 100 OFFSET '.($page*100));
    $stmt->execute();
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    file_put_contents('/var/www/test/tmp/out.txt', json_encode($rows), FILE_APPEND);
}输出文件大小为1GB。
https://stackoverflow.com/questions/28037344
复制相似问题