1

私が CouchApp を使用して作成したリスト関数に問題があり、名前であるビューから項目を取得し、その後に ID のハッシュ リストと、ユーザーの CSV ファイルを作成するための値が続きます。

function(head, req) {
    // set headers
    start({ "headers": { "Content-Type": "text/csv" }}); 

    // set arrays
    var snps = {}; 
    var test = {};
    var inds = [];

    // get data to associative array
    while(row = getRow()) {
        for (var i in row.value) {
            // add individual to list
            if (!test[i]) {
                test[i] = 1;
                inds.push(i);
            }   

            // add to snps hash
            if (snps[row.key]) {
                if (snps[row.key][i]) {
                    // multiple call
                } else {
                    snps[row.key][i] = row.value[i];
                }
            } else {
                snps[row.key] = {};
                snps[row.key][i] = row.value[i];
            }
            //send(row.key+" => "+i+" => "+snps[row.key][i]+'\n');
        }
    }

    // if there are individuals to write
    if (inds.length > 0) {
        // sort keys in array
        inds.sort();

        // print header if first
        var header = "variant,"+inds.join(",")+"\n";
        send(header);

        // for each SNP requested
        for (var j in snps) {
            // build row
            var row = j;
            for (var k in inds) {
                // if snp[rs_num][individual] is set, add to row string
                // else add ?
                if (snps[j][inds[k]]) {
                    row = row+","+snps[j][inds[k]];
                } else {
                    row = row+",?";
                }
            }

            // send row
            send(row+'\n');
        }
    } else {
        send('No results found.');
    }
}

?key="something" または ?keys=["something", "another] を使用して _list/mylist/myview (mylist は上記のリスト関数であり、ビューは上記のように返されます) を要求すると、機能しますが、クエリ文字列と私は以下のエラーが発生します:

{"code":500,"error":"render_error","reason":"function raised error: (new SyntaxError(\"JSON.parse\", \"/usr/local/share/couchdb/server/main.js\", 865)) \nstacktrace: getRow()@/usr/local/share/couchdb/server/main.js:865\n([object Object],[object Object])@:14\nrunList(function (head, req) {var snps = {};var test = {};var inds = [];while ((row = getRow())) {for (var i in row.value) {if (!test[i]) {test[i] = 1;inds.push(i);}if (snps[row.key]) {if (snps[row.key][i]) {} else {snps[row.key][i] = row.value[i];}} else {snps[row.key] = {};snps[row.key][i] = row.value[i];}}}if (inds.length > 0) {inds.sort();var header = \"variant,\" + inds.join(\",\") + \"\\n\";send(header);for (var j in snps) {var row = j;for (var k in inds) {if (snps[j][inds[k]]) {row = row + \",\" + snps[j][inds[k]];} else {row = row + \",?\";}}send(row + \"\\n\");}} else {send(\"No results found.\");}},[object Object],[object Array])@/usr/local/share/couchdb/server/main.js:979\n(function (head, req) {var snps = {};var test = {};var inds = [];while ((row = getRow())) {for (var i in row.value) {if (!test[i]) {test[i] = 1;inds.push(i);}if (snps[row.key]) {if (snps[row.key][i]) {} else {snps[row.key][i] = row.value[i];}} else {snps[row.key] = {};snps[row.key][i] = row.value[i];}}}if (inds.length > 0) {inds.sort();var header = \"variant,\" + inds.join(\",\") + \"\\n\";send(header);for (var j in snps) {var row = j;for (var k in inds) {if (snps[j][inds[k]]) {row = row + \",\" + snps[j][inds[k]];} else {row = row + \",?\";}}send(row + \"\\n\");}} else {send(\"No results found.\");}},[object Object],[object Array])@/usr/local/share/couchdb/server/main.js:1024\n(\"_design/kbio\",[object Array],[object Array])@/usr/local/share/couchdb/server/main.js:1492\n()@/usr/local/share/couchdb/server/main.js:1535\n@/usr/local/share/couchdb/server/main.js:1546\n"}
4

1 に答える 1

0

詳細をほとんど説明していないため、確かなことは言えませんが、考えられる問題の原因は、配列を使用してすべての行からデータを収集することです。予測できない量のメモリを消費します。これは、いくつかのレコードを照会すると機能し、すべてのレコードを照会すると失敗する理由を説明している可能性があります。

出力をクライアントに送信する前にすべての値を収集する必要がないように、データを整理する必要があります。map と reduce の結果はディスクに保存されますが、リスト関数はすべてのクエリで実行されることに注意してください。リスト関数を高速かつ無駄のないものにしないと、問題が発生します。

于 2012-07-12T14:01:37.823 に答える