2

私は JS が初めてで、node.js も初めてです。したがって、「従来の」プログラミングパラダイムを使用すると、ファイルは次のようになります。

var d = require('babyparse');
var fs = require('fs');

var file = fs.readFile('SkuDetail.txt');

d.parse(file);

したがって、これには多くの問題があります。

  1. 非同期ではない
  2. 私のファイルはデフォルトの最大ファイル サイズ (これは約 60 MB) よりも大きいため、現在壊れています (それが理由かどうかは 100% わかりません)。

私の質問: 大きなファイルを非同期にロードするにはどうすればよいですか (そして、これは将来の使用のために 60 MB よりもかなり大きくなります)、情報を取得するときに解析します。次に、フォローアップとして、すべてが完了したことをどのように知ることができますか?

4

3 に答える 3

5

ReadStreamを作成する必要があります。よくあるパターンはこんな感じ。dataイベントで利用可能になると、データを解析できます。

function readFile(filePath, done) {
    var 
        stream = fs.createReadStream(filePath),
        out = '';

    // Make done optional
    done = done || function(err) { if(err) throw err; };

    stream.on('data', function(data) {
        // Parse data
        out += data;
    });

    stream.on('end', function(){
        done(null, out); // All data is read
    });

    stream.on('error', function(err) {
        done(err);
    });
}

次のような方法を使用できます。

readFile('SkuDetail.txt', function(err, out) {
    // Handle error
    if(err) throw err;

    // File has been read and parsed
}

out解析されたデータを変数に追加すると、解析されたファイル全体がdoneコールバックに送信されます。

于 2015-06-11T07:39:00.730 に答える
0

チャンクを処理したいので、最初の質問については、Streams が探しているものかもしれません。@pstenstrm の回答に例があります。

また、Streams の Node.js ドキュメント リンクを確認できます: https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

Streams の簡単な説明と例が必要な場合は、次のリンクを確認してください: http://www.sitepoint.com/basics-node-js-streams/

ファイルの読み取りが完了したら、コールバックを fs.readFile 関数に渡してコンテンツを処理できます。これはあなたの2番目の質問に答えます。

fs.readFile('SkuDetail.txt', function(err, data){
    if(err){
         throw err;
    }
    processFile(data);
});

詳細については、fs.readFile からデータを取得するを参照してください。

また、Promises を使用してコードをクリーンにし、その他の利点を追加することもできます。このリンクを確認してください: http://promise-nuggets.github.io/articles/03-power-of-then-sync-processing.html

于 2015-06-11T07:47:16.943 に答える
0

それはすでに非同期であり、javascript は非同期であり、ユーザー側で追加の作業を行う必要はありません。あなたのコードは機能しますか?あなたのパースは read のコールバックの中にあるべきだと思います。それ以外の場合、readfile はスキップされ、file は null になります。

通常の状況では、作成した io コードはすべて「スキップ」され、その後のより直接的なコードが最初に実行されます。

于 2015-06-11T07:57:10.193 に答える