2017-08-28 7 views
0

あるディレクトリでファイルを再帰的に読み込み、変更して別のディレクトリに書き込むプログラムを作成しました。私はそのプログラムを実行するたびに、数百回の反復を経て突進します。私はもう一度それを実行し、それはタスクを完了するようだ。nodejs/Macと開いているファイルの制限

nodejまたはMac OS X、またはおそらくnode-on-Mac-OS-Xは、一度に開くことのできるファイル数にある程度の制限があるようです。周りを検索すると、解決策はulimit -n 10480のようなものを使用することで、すべてがうまくいくことがわかります。それは正しい方法ですか?本質的に、私はむしろ私のシステム設定をちょっと変えずに、私のプログラムを変更して限界内で動作するようにしたいと思います。

私は前述のタスクを実行するためにPerlを使用していましたが、問題はありませんでした。私は開いていて、変換してから、ファイルを閉じてから移動していたと仮定しています。 nodejsでは、asyncモードを使用して、のファイルを閉じる方法がなく、は次のファイルに進みます。 syncモードでタスクを実行すると、正常に動作します。

答えて

1

limitコマンドでasyncライブラリを使用すると、処理するファイル数を特定の数に制限できます。たとえば、

次のファイルに進む前に1つのファイルを処理する場合は、各シリーズを使用してください。

async.eachSeries(files, function (file, next) { 
    processFile(file, next); 
}, done); 
1

はい、MacOSの(そしておそらくすべてのUNIXバリアント)が開いているファイルの数に制限があり、はい、Perlはあなたが言及した理由のためにその問題を持っていませんでした。

ulimitあなたが考えているように設定するシステムではありません。 ulimitは現在のプロセスに適用され、開始時に子プロセスにコピーされます。つまり、プロセスの制限を上げると、他のプロセスには影響しません。物理メモリのようなグローバルに制約されているリソースを使用すると、他のプログラムが飢えている可能性があります。つまり、シェルでulimit -n 10480を実行すると、エフェクトはそのシェルを終了するまで持続します。

macOSでは、システム全体のオープンファイルの実際の上限は、コマンドsysctl kern.maxfilesによって与えられます。 ulimitの設定にかかわらず、システム全体で同時に開くことを試みると、ファイルを開くことができなくなります。私のシステムでは、それは12288です。これは、「システム設定」です。このシステム設定は、より永続的な効果を持つことができます。カーネルが必要とする静的な量のメモリを増加させます。ファイル記述子。

スクリプトが比較的短命の場合は、ulimitを使用してファイル記述子の制限を上げることは、おそらく問題ではありません。

私はnode.jsについてよくわかりませんが、多分(ほぼ確実に)それは一度にいくつかの非同期タスクを開始する機能を持っているので、そうすることもできます。

関連する問題