我创建了一个自定义表,不是从JTable扩展的,而且我有大量的数据大约4.000.000字符串数据(10%uniq字符串)。现在我创建并编制索引,如下所示:Java表索引存储在堆中?
我为每一列创建索引。当用户使用我的表的实时搜索功能时,我使用treeset来合并数据。
指数:
的ArrayList其表示列:
第1列|第2列|第3列|柱4
每个元素的数组列表包含表示索引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.000.000的数据,但只有10%是唯一的。 – flatronka 2012-08-09 08:58:07
所以你正在浪费高达10美元的内存。使用内存映射文件可以使效率更高,并将堆用到少于1 MB。然而,复杂性不太值得。恕我直言。 – 2012-08-09 09:02:39
如果你想看看使用内存映射文件来获得想法的库... https://github.com/peter-lawrey/Java-Chronicle我已经使用类似于这样的库来加载40亿行Java中的数据。 – 2012-08-09 09:05:32