Java表索引存储在堆中?

时间:2012-08-09 08:50:59

标签: java indexing store

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

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

指数:

表示列的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堆大小,这是不可能的,我如何优化此代码?

1 个答案:

答案 0 :(得分:1)

  

500MB堆大小是不可能的

如果你有40亿个字符串,我会严重怀疑它只使用那么多。我怀疑你的申请在那时停止了。

如果您有“4.000.000.000字符串数据”,那么每个字符串将使用大约100个字节存储在一个集合中(假设字符串很短)

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

另一方面,如果你的意思是400万,而不是40亿,那么500 MB的大小是非常合理的。鉴于目前500 MB的成本约为10美元,我不担心。