나는 1500 명의 사람들을위한 실험 결과를 담고있는 큰 데이터베이스를 가지고있다. 각 개인은 96 개의 데이터 포인트를 가지고 있습니다. 분석 소프트웨어에서 사용할 수 있도록 데이터를 요약하고 형식을 지정하기 위해 다음 스크립트를 작성했습니다. 처음에는 500 명이 넘을 때까지 모두 좋았습니다. 이제 나는 기억이 부족하다.mysql에서 제한된 메모리로 큰 결과 집합을 처리하기
누군가가 속도를 희생하지 않고 메모리 제한 문제를 극복하기위한 제안을 갖고 있는지 궁금합니다.
이 데이터베이스의 테이블 모습
fishId assayId 그래서이 데이터베이스에 대한 호출입니다
14_1_1 2 AA
$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();
AT allele2
14_1_1 1 allele1하는 방법입니다 . 필요한 파일을 만들기 위해 두 테이블의 정보를 결합합니다.
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를 파일에 씁니다.
나는) (2
14_1_1 ATAA
$location = "results/" . "$filename" . "_result.txt";
$fh = fopen("$location", 'w') or die ("Could not create destination file");
if(fwrite($fh, $body))
'$ results = $ query-> fetchAll()) {'을 사용하지 말고 한 번에 한 행을 가져 와서 처리하면 메모리의 $ 결과 크기가 줄어든다. –
나는 가지고있다. 모든 작업으로 파일에 쓰지 않을 때 최상의 성능을 얻을 수 있음을 발견했습니다. 데이터의 길이에 따라 종종 100-1000 행마다 쓰기 작업을 수행합니다. 귀하의 경우, 메모리가 부족하거나 행이 매우 길면 모든 쓰기 작업에 대해 100 개의 레코드를 읽으십니까? (파일을 만지는 것은 정상적으로 데이터를 읽는 것과 비교하면 상당히 길다). – Fluffeh
고마워, 마크. 나는 그것을 시도 할 것이다. – anotherlife