php - 使用有限的内存处理来自 mysql 的大型结果集

标签 php mysql performance memory pdo

我有一个大型数据库,其中包含 1500 人的实验结果。每个人都有 96 个数据点。我编写了以下脚本来总结并格式化数据,以便分析软件可以使用它。起初一切都很好,直到我的人数超过 500 人。现在我的内存不足了。

我想知道是否有人现在有建议来克服内存限制问题而不牺牲速度。

这是表在数据库中的样子

fishId 检测 ID 等位基因 1 等位基因 2

14_1_1 1 个T

14_1_1 2 A A

$mysql = new PDO('mysql:host=localhost; dbname=aquatech_DB', $db_user, $db_pass);
$query = $mysql->prepare("SELECT genotyped.fishid, genotyped.assayid, genotyped.allele1, genotyped.allele2, fishId.sex, " .
"fishId.role FROM `fishId` INNER JOIN genotyped ON genotyped.fishid=fishId.catId WHERE fishId.projectid=:project");
$query->bindParam(':project', $project, PDO::PARAM_INT);
$query->execute();  

所以这是对数据库的调用。它连接两个表中的信息来构建我需要的文件。

 if(!$query){
    $error = $query->errorInfo();
    print_r($error);
} else { 
    $data = array();
    $rows = array();
    if($results = $query->fetchAll()){
        foreach($results as $row)
        {
            $rows[] = $row[0];
            $role[$row[0]] = $row[5];
            $data[$row[0]][$row[1]]['alelleY'] = $row[2];
            $data[$row[0]][$row[1]]['alelleX'] = $row[3];
        }
        $rows = array_unique($rows);
        foreach($rows as $ids)
        {
            $col2 = $role[$ids];
            $alelleX = $alelleY = $content = "";
            foreach($snp as $loci)
            {
                $alelleY = convertAllele($data[$ids][$loci]['alelleY']);
                $alelleX = convertAllele($data[$ids][$loci]['alelleX']);
                $content .= "$alelleY\t$alelleX\t";
            }
            $body .= "$ids\t$col2\t" . substr($content, 0, -1) . "\n";

这会解析数据。在我需要的文件中,每个人必须有一行,而不是每个人有 96 行,这就是必须格式化数据的原因。在脚本的最后,我只是将 $body 写入文件。

我需要输出文件

FishId 检测 1 检测 2

14_1_1 ATA

$location = "results/" . "$filename" . "_result.txt";
$fh = fopen("$location", 'w') or die ("Could not create destination file");
if(fwrite($fh, $body))

最佳答案

不要使用 fetchAll() 将数据库查询的整个结果读取到变量中,而是逐行获取:

while($row = $query->fetch()) { ... }

关于php - 使用有限的内存处理来自 mysql 的大型结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44047916/

相关文章:

c++ - 如何优化 n-queens OpenMP 并行程序?

PhpSpreadsheet foreach 循环遍历多个工作表

windows - 与 GitHub 相比,Windows 文件共享上的 Git 速度慢

php - 缓存,PHP 生成的缩略图加载缓慢

mysql - 如何将 Visual Studio 连接到 Aurora MySQL DB?

mysql - 尝试为 zencart 运行 SQL 查询时出现意外 token 问题

mysql - (MySQL) SQL 错误 : ERROR 1054 (42S22): Unknown column '<Column Name>' in 'field list'

php - 使用 PHP 和 MAMP 从本地主机发送邮件

php - 使用 php 使用两个查询在文章页面上创建面包屑

javascript - 如何对 HTML 的 PHP 字符串进行编码以供 JavaScript 函数用作字符串?