【发布时间】:2012-08-06 11:09:27
【问题描述】:
我创建了一个自定义表,而不是从 JTable 扩展,并且我有大量数据,大约 4.000.000 个字符串数据(10% uniq 字符串)。现在我创建和索引如下所示:
我为每一列创建和索引。当用户使用我的表的实时搜索功能时,我使用树集来合并数据。
索引:
表示列的ArrayList:
第 1 栏 |第 2 栏 |第 3 栏 |第 4 栏
arraylist 中的每个元素都包含一个 HasMap,它表示索引:
键 -> 数据字符串
value -> value 表示 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 堆大小,这是不可能的,我该如何优化此代码?
【问题讨论】: