2017-09-27 5 views
0

以下のコードを使ってAscii Stlファイル(頂点の座標を持つ)を解析し、各頂点の出力座標を求めます。 STLファイルは、単にシステムが殺さuntile MEMを実行するスクリプトとして外に排出される一方、ノードスクリプトの実行が、システムに残さに関する600M MEM形成コンソールnodejs関数はすべてのメモリを使い果たしましたか?

[email protected]:~/node$ ls -l DNA_mit_Anhnger.stl 
-rw-r--r-- 1 roofe roofe 34964929 Sep 27 09:50 DNA_mit_Anhnger.stl 

~/node$ node test.js DNA_mit_Anhnger.stl 
vertex 4.893074e-001 8.750000e+000 2.695633e-001 
free mem:: 557mb 
vertex 5.357143e-001 8.750000e+000 3.077444e-001 
free mem:: 557mb 

が約30M、ですがスクリプト

Killed 
[email protected]:~/node$ 

スクリプトが実行されている、私も

[email protected]:~/node$ ps v 

    PID TTY  STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 
    1064 tty1  S+  0:00  1 975 21492  4 0.0 -bash 
18623 pts/1 Ss+ 0:00 715 975 21612  4 0.0 -bash 
19140 pts/2 Ss  0:00 1352 975 21604 16 0.0 -bash 
19482 pts/3 Ss  0:00 2594 975 21596 1124 0.1 -bash 
77681 pts/2 Rl+ 0:19 120131 10894 2090529 737716 73.9 node 

(ここでは2ギガバイトMemのUbuntu16サーバーLTS VMvareマシン上にある)、システムMEMをチェックするために、別の端末を使用ここではスクリプトがある、

var fs = require("fs"); 
var os = require('os'); 
var data = fs.readFileSync(process.argv[2]); 
var parseAscii = function(data) { 
    var offset = 0; 
    var str = ''; 
    while(offset = data.indexOf('vertex', ++offset)) { 
     str = data.substr(offset, data.indexOf('\n', offset) - offset); 
     console.log(str); 
     console.log('free mem:: ' + Math.ceil(os.freemem()/(1024*1024)) + 'mb'); 
    } 
    console.log('finish'); 
} 
parseAscii(data.toString()); 

アスキーSTLファイル形式は、このように私は、全体の午後のための問題で作業してきた

solid ascii 
    facet normal -6.343656e-001 -5.556834e-002 7.710334e-001 
    outer loop 
     vertex 4.893074e-001 8.750000e+000 2.695633e-001 
     vertex 5.357143e-001 8.750000e+000 3.077444e-001 
     vertex 5.077149e-001 8.785503e+000 2.872667e-001 
    endloop 
    endfacet 
    facet normal -7.010786e-001 -9.853018e-002 7.062440e-001 
    outer loop 
     vertex 4.616061e-001 8.782279e+000 2.410454e-001 
     vertex 5.077149e-001 8.785503e+000 2.872667e-001 
     vertex 4.526215e-001 8.846208e+000 2.410454e-001 
    endloop 
    endfacet 

ですが、それはほとんどのドライブ何も見つけません私は狂っている。

+1

ループがいつ壊れますか?文字列が見つからない場合、 'indexOf'は-1を返します。 '-1'は' true'と評価されます – sidgate

+0

そうです、それは無限ループを引き起こします。私はまた、なぜそれがすべての記憶を使い果たしてしまうのか分からない。 –

答えて

2

あなたのループはどんな状態でも壊れません。最後のvertexが処理されると、indexOfは何も見つからない場合は-1を返します。 offsetは-1に設定され、whileループは無期限に反復されます。必要なのは、比較する小切手を追加することです。

while((offset = data.indexOf('vertex', ++offset))!=-1) 
+0

ありがとうございます。私はjsで多くの経験がありません。 'Falseを返す他のプログラミング言語の' substr() 'のようなものが見つからなかった場合、' indexOf() 'が異なる出力を持つことはわかりません。 –

+0

私はまた、ここでいくつかの混乱がありますが、無限のwhileループは、より多くのmemを使い果たしてはいけません。関数内には固定メモリだけを割り当てる必要があります。 –

関連する問題