2017-05-21 3 views
0

私は、ブラウザで膨大なデータセット(1,000万行を読み込む)に対応できるCSVパーサーを開発しています。配列のメモリ使用

次のように基本的には、パーサが動作します。

  1. メインスレッドは、それ以外のブラウザはすぐにクラッシュする、20メガバイトのチャンクを読み込みます。その後、読み取られたデータのチャンクをワーカーの1人に送信します。

  2. 作業員はデータを受け取り、私が望まない列を破棄して、必要なものを保存します。通常、私は20-30のうち4〜5桁しか必要としません。

  3. ワーカーは、処理されたデータをメインスレッドに返します。

  4. メインスレッドはデータを受信し、データ配列に保存します。

  5. ファイルが完了するまで、手順1〜4を繰り返します。データセット(crimes city of chicago)と終わり

、私はそれの内部71の他のアレイを有し、これらの配列の各々は+/- 90Kの要素を含む配列で終わります。これらの90K要素のそれぞれには、5つの文字列(読み込みファイルから取得された列)が含まれています。すなわち、緯度、経度、年、ブロックおよびIUCR。

要約すると、71はデータセット内の20MBのチャンク数、90Kは各チャンク内の20MBの行数、5は抽出されたカラムです。

ブラウザ(Chrome)が多すぎるメモリを使用していたため、4つの異なるブラウザ(Chrome、Opera、Vivaldi、Firefox)で試してみました。

  1. クロム - 1.76ギガバイト
  2. オペラ - 1.76ギガバイト
  3. のFirefox - 1.3ギガバイト
  4. ヴィヴァルディ - 1ギガバイト

私は同じ配列を再作成しようとするが、模擬データと、それを約のみを使用します。メモリの350メガバイト:

var data = []; 
for(let i = 0; i < 71; i++){ 
    let rows = []; 
    for(let j = 0; j < 90*1000; j++){ 
     rows.push(["029XX W MADISON ST", "2027", "-87.698850575", "2001", "41.880939487"]) 
    } 
    data.push(rows); 
} 

Iは配列が静的である場合、上記のコードに見られるように、それは動的場合よりも良好に機能することが容易だということを理解します。しかし、同じ量のデータに対して5倍のメモリを使用することは期待していませんでした。

パーサでメモリを少なくするためにできることは何ですか?

+0

私は本当にあなたがブラウザでこれをやろうとしているべきではないと思います。 –

+0

これはサーバ(多分nodejs)上で実行することができます。それは環境/メモリの変更に依存せず、ストリームと呼ばれる良い実装を持っています。 –

+0

@torazaburoあなたはおそらく大丈夫です。なぜ私はそれをしてはならない理由を教えてもらえますか? –

答えて

0

基本的にメモリを少なくするには、いくつかの手法を使用できます。

最初に、数字を含むCSVの列を変換してそのまま使用する必要があります。 Javascriptの数字は8バイトを取るが、文字列と同じ数はより多くのスペース(1文字あたり2バイト)を取ることができる。

もう1つのことは、ジョブが完了したときにすべてのワーカーを終了させることです。

関連する問題