2014-01-17 2 views
11

Node.jsでは、child_processモジュールのexecコマンドを使用して、大量のテキストを標準出力に戻して解析して使用するアルゴリズムをJavaで呼び出しています。私はほとんどそれをキャプチャすることができますが、特定の行数を超えると、コンテンツがカットオフです。Node.jsの標準出力child_process execが短くなっています

exec("sh target/bin/solver "+fields.dimx+" "+fields.dimy, function(error, stdout, stderr){ 
    //do stuff with stdout 
} 

私はsetTimeoutsとコールバックを使用してみましたが、成功していないが、私はそれを完全に取得することができます前に、私は私のコードで標準出力を参照していますので、これは発生していると感じます。私はstdoutが実際にデータ損失が発生した場所であることをテストしました。さらに非同期の問題ではありません。私もローカルマシンとHerokuでこれをテストしました。まったく同じ問題が発生し、まったく同じ行番号で切り捨てられます。

これに役立つ情報はありますか?

答えて

4

編集: 私は自分のコンピュータ(windows)にdir /sにしようと、同じ問題を持っている(それはバグのように見える)、このコードは私のためにその問題を解決する:

var exec = require('child_process').exec; 

function my_exec(command, callback) { 
    var proc = exec(command); 

    var list = []; 
    proc.stdout.setEncoding('utf8'); 

    proc.stdout.on('data', function (chunk) { 
     list.push(chunk); 
    }); 

    proc.stdout.on('end', function() { 
     callback(list.join()); 
    }); 
} 

my_exec('dir /s', function (stdout) { 
    console.log(stdout); 
}) 
+0

あなたはそれがバグのように見えると思いますなぜ?述べin this article、卵が大量のデータを処理するための、より適しているとして 私の答えを見てください – olamotte

+0

@olamotteあなたはこの答えの歴史を見ることができます、私はバッファサイズを増やしましたが、それは私のためには機能しません。 – damphat

+0

私は窓にもあり、それはうまく動作します:/ – olamotte

8

私は幹部を持っていました。 stdout.on( 'end')コールバックは@damphatソリューションで永遠に掛かっています。

別の解決策は、execのオプションでバッファサイズを大きくすることである:maxBufferは、標準出力または標準エラー出力に許容されるデータの最大量を指定 - この値を超えた場合:引用するhere

{ encoding: 'utf8', 
    timeout: 0, 
    maxBuffer: 200*1024, //increase here 
    killSignal: 'SIGTERM', 
    cwd: null, 
    env: null } 

マニュアルを参照してください子プロセスが強制終了されます。私は今、以下を使用しています:これは、受け入れられたソリューションとは対照的に、stdoutでカンマで区切られたチャンクの分離された部分を処理する必要はありません。

exec('dir /b /O-D ^2014*', { 
    maxBuffer: 2000 * 1024 //quick fix 
    }, function(error, stdout, stderr) { 
     list_of_filenames = stdout.split('\r\n'); //adapt to your line ending char 
     console.log("Found %s files in the replay folder", list_of_filenames.length) 
    } 
); 
7

この問題に対する実際の(そして最良の)解決策は、execではなくspawnを使用することです。

child_process.exec returns the whole buffer output from the child process. By default the buffer size is set at 200k. If the child process returns anything more than that, you program will crash with the error message "Error: maxBuffer exceeded". You can fix that problem by setting a bigger buffer size in the exec options. But you should not do it because exec is not meant for processes that return HUGE buffers to Node. You should use spawn for that. So what do you use exec for? Use it to run programs that return result statuses, instead of data.

産卵は、execとは異なる構文が必要:

var proc = spawn('sh', ['target/bin/solver', 'fields.dimx', 'fields.dimy']); 

proc.on("exit", function(exitCode) { 
    console.log('process exited with code ' + exitCode); 
}); 

proc.stdout.on("data", function(chunk) { 
    console.log('received chunk ' + chunk); 
}); 

proc.stdout.on("end", function() { 
    console.log("finished collecting data chunks from stdout"); 
}); 
+1

この回答ありがとう!それは私の 'exec 'が1MBの出力のためにエラーを返すことを理解する助けになりました。残念ながら、 'exec'のエラーオブジェクトは、エラーの理由を詳述せずにコマンド名を返すだけでした:' {"cmd": "./ read_mail.sh"} ' – ishahak

関連する問題