4

私は 10 万個の JSON ファイルを「歩いて」おり、何か問題が発生した場合はコンテンツを読み取り、エラーをスローしています。

walk(__dirname + '/lastfm_test', 'json', function (err, files) {
    files.forEach(function (filePath) {
        fs.readFile(filePath, function (err, data) {
            if (err) throw err;
        });
    });
});

walk 関数は、主にこの質問(chjj の回答) に触発されています。いくつかの反復の後、行if (err) throw errが実行されます。エラースローは次のとおりです。

エラー: OK、「path/to/somejsonfile.json」を開きます

ここで何が起こっているのかを調査する機会はありますか? 関数は問題ないと確信しています。walk実際、呼び出しfs.readFile()をに置き換えるとconsole.log(filePath)、パスが表示されます。エラーなし。

役立つ情報: Windows 7 x64、node.exe x64 .0.10.5。ここからダウンロードした Last.fm データセット。

4

2 に答える 2

5

この目的には、 graceful-fsモジュールを使用することをお勧めします。開いているファイル記述子の数を自動的に制限します。npm の作成者で Node のメンテナーである Isaac Schlueter によって書かれているので、かなりしっかりしています。裸の fs モジュールを使用すると、自分自身を撃つことができます。

于 2013-05-07T18:20:32.060 に答える
3

「foreach-loop」はreadFile非常に頻繁に実行されています。NodeJS は、バックグラウンド スレッドでファイルを開き始めます。ただし、foreach ループが終了する (そしてすべてのファイル オープン リクエストがスケジュールされる) まで、NodeJS メイン スレッドでファイルが処理されることはありません。このため、すべてのファイルを開いている間、ファイルは処理されません (後で閉じられます)。ある時点で多くのファイルが開かれ、使用可能なすべてのハンドルが使用されるため、役に立たないエラー メッセージが表示されます。

それらはあなたの問題に対する複数の解決策です:

まず、すべてのファイルを次々と同期的に開くことができます。しかし、これはアプリケーションの速度を低下させ、NodeJS のイベント ベースのプログラミング モデルと一致しません。(ただし、パフォーマンスを気にしない場合は、最も簡単な解決策です)

一度に特定の量のファイル (例: ~1000 ファイル) のみを開き、1 つの処理後に次のファイルを開くことができます。

疑似コード:

1. walk the file system and store all file name in an array
2. fs.readFile for a batch of files from the array
3. In the callback of readFile after processing, start opening more files from the array if not empty.
于 2013-05-07T18:20:16.193 に答える