大きなJavaリストでのパフォーマンスの低下

ジェイ・ハッカー:

大きなテキストコーパスをJavaでメモリに読み込もうとしています。ある時点で壁にぶつかり、ゴミがたまらなく収まります。誰かがJavaのGCを破って大量のデータセットを送信する経験があるかどうか知りたいのですが。

8 GBの英語テキストファイルをUTF-8で、1行に1文ずつ読んでいます。私がしたいsplit()空白の各ラインと、その結果文字列を格納しArrayList<String[]>、さらなる処理のために。問題を示す簡単なプログラムを次に示します。

/** Load whitespace-delimited tokens from stdin into memory. */
public class LoadTokens {
    private static final int INITIAL_SENTENCES = 66000000;

    public static void main(String[] args) throws IOException {
        List<String[]> sentences = new ArrayList<String[]>(INITIAL_SENTENCES);
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        long numTokens = 0;
        String line;

        while ((line = stdin.readLine()) != null) {
            String[] sentence = line.split("\\s+");
            if (sentence.length > 0) {
                sentences.add(sentence);
                numTokens += sentence.length;
            }
        }
        System.out.println("Read " + sentences.size() + " sentences, " + numTokens + " tokens.");
    }
}

かなりカットアンドドライですね。私が私のサイズを事前に設定していることに気付くでしょうArrayList私は6600万弱の文と13億のトークンを持っています。今、あなたはあなたのサッと取り出した場合にJavaオブジェクトのサイズを参照し、あなたの鉛筆を、あなたは約要求すべきであることを見つけることができます:

  • 66e6 String[]参照@ 8バイトEA = 0.5 GB
  • 66e6 String[]オブジェクト@ 32バイトEA = 2 GB
  • 66e6 char[]オブジェクト@ 32バイトEA = 2 GB
  • 1.3e9 String参照@ 8バイトEA = 10 GB
  • 1.3e9 Strings @ 44バイトea = 53 GB
  • 8e9 chars @ 2バイトea = 15 GB

83 GB圧縮OOPは32 GBを超えるヒープでは役に立たないため、64ビットのオブジェクトサイズを使用する必要があることに気付くでしょう。)128 GBのRAMを備えたRedHat 6マシンがあるので幸いです。pv giant-file.txt | java -Xmx96G -Xms96G LoadTokens安全のために、Java SE 1.6.0_29キットからJava HotSpot(TM)64ビットサーバーVM(ビルド20.4-b02、混合モード)を起動し、を見ながらキックバックしtopます。

入力の半分未満のどこか、RSSが約50〜60 GBの場合、パラレルガベージコレクターは最大1300%のCPU(16 procボックス)を起動し、読み取りの進行が停止します。次に、それは数GB増加し、その後、進行はさらに長く停止します。容量は96 GBですが、まだ完了していません。私はそれを1時間半放置しました、そしてそれはちょうどGCをしている〜90%システム時間を燃やしています。それは極端に思えます。

気が狂っていないことを確認するために、私は同等のPython(2行すべて)を作成し、約12分で70 GBのRSSで完了しました。

だから:私は何かばかげていますか?(一般的に非効率的な方法でデータを保存する方法は別として、私は本当に手助けすることはできません。データ構造が太っていても、Javaが収まらない限り、Javaは窒息しないでください。)魔法のGCアドバイスはありますか?本当に大きなヒープのために?私は試しましたが-XX:+UseParNewGC、それはさらに悪いようです。

ジェイ・ハッカー:

-XX:+UseConcMarkSweepGC:78 GBで終了し、約12分です。(Pythonとほぼ同じです!)皆の助けに感謝します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

2つのINステートメントを含む大きなテーブルでのMySQLクエリのパフォーマンスの低下

分類Dev

Java-大きな文字列で複数行の正規表現のパフォーマンスが低下する

分類Dev

大きな.txtでパフォーマンスが低下する

分類Dev

大きなサイズのパフォーマンス低下で複数のアイコンを描画すると

分類Dev

大きなアレイサイズでのSSEパフォーマンスの低下

分類Dev

大きなリストでのポリマーコアと紙要素のパフォーマンス

分類Dev

50.000.000ドキュメントに加えて大規模なコレクションでのMongoDBの書き込みパフォーマンスの低下

分類Dev

WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

分類Dev

WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

分類Dev

Reactによる大きなリストのパフォーマンス

分類Dev

Java演習でのパフォーマンスの低下

分類Dev

パフォーマンス-Pythonで文字列の2つの大きなリストを比較する最速の方法

分類Dev

Linuxでの大規模で予測不可能なI / Oパフォーマンスの低下

分類Dev

Linuxでの大規模で予測不可能なI / Oパフォーマンスの低下

分類Dev

withStylesのマテリアルUIの潜在的なパフォーマンスの低下

分類Dev

ブーストスピリットのパフォーマンス低下

分類Dev

BCryptのパフォーマンス低下

分類Dev

主キーのサイズが原因で、大きなテーブルでMySQLInsertのパフォーマンスが低下します

分類Dev

mongodbの大きなネストされたデータのクエリパフォーマンスの問題

分類Dev

ブーストスピリットでストリームを使用すると、パフォーマンスが大幅に低下するのはなぜですか?

分類Dev

明らかな理由なしにJava 8が予測できないパフォーマンス低下をストリーミングする

分類Dev

大きな配列で複数の「.filter」呼び出しを使用すると、Javascriptのパフォーマンスが低下しますか?

分類Dev

iOS9のUIWebViewでの大幅なパフォーマンスの低下

分類Dev

Pythonでの非常に大きな辞書のパフォーマンスの向上

分類Dev

大きなパケットを使用するとパフォーマンスが低下する

分類Dev

メモリ内の大きなobjのパフォーマンス

分類Dev

大きな数の整数型のパフォーマンス

分類Dev

CythonでのC ++関数のパフォーマンスの低下

分類Dev

Win10でのVirtualBoxのパフォーマンスの低下

Related 関連記事

  1. 1

    2つのINステートメントを含む大きなテーブルでのMySQLクエリのパフォーマンスの低下

  2. 2

    Java-大きな文字列で複数行の正規表現のパフォーマンスが低下する

  3. 3

    大きな.txtでパフォーマンスが低下する

  4. 4

    大きなサイズのパフォーマンス低下で複数のアイコンを描画すると

  5. 5

    大きなアレイサイズでのSSEパフォーマンスの低下

  6. 6

    大きなリストでのポリマーコアと紙要素のパフォーマンス

  7. 7

    50.000.000ドキュメントに加えて大規模なコレクションでのMongoDBの書き込みパフォーマンスの低下

  8. 8

    WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

  9. 9

    WatchOSのNavigationLinksでSwiftUIリストのパフォーマンスが低下する

  10. 10

    Reactによる大きなリストのパフォーマンス

  11. 11

    Java演習でのパフォーマンスの低下

  12. 12

    パフォーマンス-Pythonで文字列の2つの大きなリストを比較する最速の方法

  13. 13

    Linuxでの大規模で予測不可能なI / Oパフォーマンスの低下

  14. 14

    Linuxでの大規模で予測不可能なI / Oパフォーマンスの低下

  15. 15

    withStylesのマテリアルUIの潜在的なパフォーマンスの低下

  16. 16

    ブーストスピリットのパフォーマンス低下

  17. 17

    BCryptのパフォーマンス低下

  18. 18

    主キーのサイズが原因で、大きなテーブルでMySQLInsertのパフォーマンスが低下します

  19. 19

    mongodbの大きなネストされたデータのクエリパフォーマンスの問題

  20. 20

    ブーストスピリットでストリームを使用すると、パフォーマンスが大幅に低下するのはなぜですか?

  21. 21

    明らかな理由なしにJava 8が予測できないパフォーマンス低下をストリーミングする

  22. 22

    大きな配列で複数の「.filter」呼び出しを使用すると、Javascriptのパフォーマンスが低下しますか?

  23. 23

    iOS9のUIWebViewでの大幅なパフォーマンスの低下

  24. 24

    Pythonでの非常に大きな辞書のパフォーマンスの向上

  25. 25

    大きなパケットを使用するとパフォーマンスが低下する

  26. 26

    メモリ内の大きなobjのパフォーマンス

  27. 27

    大きな数の整数型のパフォーマンス

  28. 28

    CythonでのC ++関数のパフォーマンスの低下

  29. 29

    Win10でのVirtualBoxのパフォーマンスの低下

ホットタグ

アーカイブ