1

我创建了一个自定义表,而不是从 JTable 扩展,并且我有大量数据,大约 4.000.000 个字符串数据(10% uniq 字符串)。现在我创建和索引它看起来像这样:

我为每一列创建和索引。当用户使用我的表的实时搜索功能时,我使用树集来合并数据。

指数:

表示列的 ArrayList:
第 1 列 | 第 2 栏 | 第 3 栏 | 第 4 列
arraylist 中的每个元素都包含一个表示索引的 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 个字节来存储在集合中(假设字符串很短)

这意味着您需要 400 GB 的内存。使这更有效和可行的唯一方法是使用内存映射文件。通过这种方式,您可以相当轻松地保存这么多数据。

另一方面,如果您的意思是 400 万,而不是 40 亿,那么 500 MB 的大小是相当合理的。鉴于这些天 500 MB 的成本约为 10 美元,我不会担心。

于 2012-08-09T08:54:53.103 回答