1

JTableから拡張するのではなく、カスタムテーブルを作成しましたが、約4.000.000文字列データ(10%uniq文字列)の膨大な量のデータがあります。今、私はこのように見えるインデックスを作成してインデックスを付けます:

すべての列を作成してインデックスを作成します。ユーザーがテーブルのライブ検索機能を使用するときに、データをマージするためにツリーセットを使用します。

索引:

列を表すArrayList:
列1 | 列2| 列3| 列
4arraylistの各要素には、インデックスを表すHasMapが含まれています。
キー->データ文字列
値->値は、TreeSet内にこのインデックスが含まれる行を表します。

例:

Name Column:
Emma 
John
Doe
Emma
Walker
Emma
Doe

HashMap(Emma) -> 0, 3, 5
private void buildIndex()
    {
        if (monitorModel.getMessageIndex() == null)
        {
            ArrayList<HashMap<String, TreeSet<Integer>>> messageIndex = new ArrayList<>(filterableColumn.length);
            for (int i = filterableColumn.length; i >= 0; i--)
            {
                HashMap<String, TreeSet<Integer>> hash = new HashMap<>();
                messageIndex.add(hash);
            }
            // create index for every column
            for (int i = monitorModel.getParser().getMyMessages().getMessages().size() - 1; i >= 0; --i)
            {
                TreeSet<Integer> tempList;

                for (int j = 0; j < filterableColumn.length; j++)
                {
                    String value  = StringPool.getString(getValueAt(i, j).toString());
                    if (!messageIndex.get(j).containsKey(value))
                    {
                        tempList = new TreeSet<>();
                        messageIndex.get(j).put(value, tempList);
                    }
                    else
                    {
                        tempList = messageIndex.get(j).get(value);
                    }

                    tempList.add(i);
                }
            }
            monitorModel.setMessageIndex(messageIndex);
        }
    }

このソリューションは不可能な500MBのヒープサイズを使用しますが、このコードを最適化するにはどうすればよいですか?

4

1 に答える 1

1

不可能な500MBのヒープサイズ

40億本の弦がある場合、それだけを使用するのではないかと真剣に疑っています。その時点でアプリケーションが停止しているのではないかと思います。

「4.000.000.000文字列データ」がある場合、これはコレクションに格納するために文字列ごとに約100バイトを使用します(文字列が短いと仮定)

これは、400GBのメモリが必要であることを意味します。これをより効率的かつ実行可能にする唯一の方法は、メモリマップトファイルを使用することです。この方法で、これだけのデータをかなり簡単に保持できます。

一方、40億ではなく、400万を意味する場合、500MBのサイズは非常に合理的です。最近の500MBのコストは約$10なので、心配する必要はありません。

于 2012-08-09T08:54:53.103 に答える