1

papa-parse を使用してブラウザー側で処理している 40,000 行の単純な CSV ファイルがあります。

Discover Meteor や、Google で見つけた他の 101 件の投稿のテクニックを使用して、それらを 1 つずつコレクションに挿入しようとしています。

40000 はブラウザー側でかなり迅速に挿入されますが、mongo サーバー側を確認すると、387 レコードしかありません。

最終的に (通常は 20 秒程度)、サーバー側への挿入が開始されます。しかし、ブラウザを閉じたり中断したりすると、既に挿入されているレコードは明らかに消えます。

挿入をサーバー側に強制する方法、または少なくとも監視して、ユーザーに成功をいつ通知するかを知るにはどうすればよいですか?

Tracker.flush() を試してみました違いはありません。

Meteor.method でサーバー側の挿入を行いますが、すべてのサーバー側の CSV ライブラリは、クライアント側よりも操作が複雑です (私はほとんどすべてのプログラミングの初心者です :)

ありがとう!


これは私のコードの主要部分です(クライアントフォルダー内):

Template.hello.events({

    "submit form": function (event) {

        event.preventDefault();

        var reader = new FileReader();

        reader.onload = function (event) {

            var csv = Papa.parse(this.result, {header: true});

            var count = 0;

            _.forEach(csv.data, function (csvPerson) {
                count++;
                Person.insert(csvPerson);
                console.log('Inserting: ' + count + ' -> ' + csvPerson.FirstName);
            });

        };

        reader.readAsText(event.target[0].files[0]);
    }
});

コンソール出力の最後の数行:

Inserting: 39997 -> Joan 
Inserting: 39998 -> Sydnee 
Inserting: 39999 -> Yael 
Inserting: 40000 -> Kirk 

CSV (ランダム生成データ) の最後の数行:

Jescie,Ayala,27/10/82,"P.O. Box 289, 5336 Tristique Road",Dandenong,7903,VI,mus.Proin@gravida.co.uk
Joan,Petersen,01/09/61,299-1763 Aliquam Rd.,Sydney,1637,NS,sollicitudin@Donectempor.ca
Sydnee,Oliver,30/07/13,Ap #648-5619 Aliquam Av.,Albury,1084,NS,Nam@rutrumlorem.ca
Yael,Barton,30/12/66,521 Auctor. Rd.,South Perth,2343,WA,non.cursus.non@etcommodo.co.uk
Kirk,Camacho,25/09/08,"Ap #454-7701 A, Road",Stirling,3121,WA,dictum.eu@morbitristiquesenectus.com

hello テンプレートは明らかに単純なフォームで、ファイルを選択して送信するだけです。クライアント コードは client ディレクトリの下にあります。アプリケーション ルートのファイルで定義された人物。複雑さを避けるため、現時点では CSV は文字列として解析されます。挿入されたレコードは問題ないように見え、名前で取得します。

コンソールの Person.find().count() ブラウザ側では 40000 になります。

このファイルはわずか 1.5 MB で、ランダム データであり、機密ではありません。

4

2 に答える 2

0

call() は次のように機能するはずです。

クライアント側

Meteor.call("insertMethod",csvPerson);

そしてサーバー側のメソッド

insertMethod: function(csvPerson){
Person.insert(csvPerson);
}
于 2014-11-18T10:15:35.433 に答える
0

Meteor では、一部のシナリオでは、コールバックを渡さない場合、操作が同期されます。

サーバーでコードを実行するPerson.insert(csvPerson);と、操作は非同期ではなく同期になります。やりたいことによっては、将来深刻な問題が発生する可能性があります。クライアントでは、同期ではなく非同期になります。

node.js はイベントベースのサーバーであるため、1 回の同期操作でシステム全体が停止する可能性があります。同期操作に真剣に取り組む必要があります。

データをインポートするための最良のオプションは、サーバー側の内部で行うことですMeteor.startup(function(){ //import code goes here})

Sindis によって提案されたソリューションは機能しますが、速度が遅く、ブラウザーが (何らかの理由で) 閉じた場合、既に挿入されたレコードを追跡していません。を使用する場合Meteor.call("insertMethod",csvPerson);、この操作はクライアントで同期されます。

初心者のシナリオでの最良のオプション (最適ではありません) は、次のとおりです。

1-While(挿入するレコードがあります)

2- コールバックなしで Meteor.call を呼び出す

3-コレクションに挿入されたすべてのフィールドを数えます

4- この値を localStorage に保存します

5- ステップ 1 に戻る

これは、挿入の試行ごとに挿入の順序が同じであると仮定して機能します。ブラウザが失敗した場合は、いつでも localStorage から値を取得して、その数のレコードをスキップできます。

于 2014-11-19T01:24:27.327 に答える