Java表索引存储在堆中?

Java表索引存储在堆中?,java,indexing,store,Java,Indexing,Store,我创建了一个自定义表,而不是从JTable扩展而来,我有大量的数据,大约4.000.000字符串数据(10%uniq字符串)。现在我创建并索引如下所示: 我为每一列创建和索引。当用户使用我的表的实时搜索功能时,我使用treeset合并数据 索引: 表示列的ArrayList: 第1列|第2列|第3列|第4列 arraylist中的每个元素都包含一个表示索引的HasMap: 键->数据字符串 值->表示树集中包含此索引的行的值 例如: Name Column: Emma John Doe Emm

我创建了一个自定义表,而不是从JTable扩展而来,我有大量的数据,大约4.000.000字符串数据(10%uniq字符串)。现在我创建并索引如下所示:

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

索引:

表示列的ArrayList:
第1列|第2列|第3列|第4列
arraylist中的每个元素都包含一个表示索引的HasMap:
键->数据字符串
值->表示树集中包含此索引的行的值

例如:

Name Column:
Emma 
John
Doe
Emma
Walker
Emma
Doe

HashMap(Emma) -> 0, 3, 5
private void buildIndex()
{
if(monitorModel.getMessageIndex()==null)
{
ArrayList messageIndex=新的ArrayList(filterableColumn.length);
对于(int i=filterableColumn.length;i>=0;i--)
{
HashMap hash=新的HashMap();
messageIndex.add(散列);
}
//为每列创建索引
对于(int i=monitorModel.getParser().getMyMessages().getMessages().size()-1;i>=0;--i)
{
树丛圣殿骑士;
对于(int j=0;j
这个解决方案使用500MB的堆大小,这是不可能的,我怎样才能优化这个代码

500 MB的堆大小,这是不可能的

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

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

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

另一方面,如果你的意思是400万,而不是40亿,那么500MB的大小是相当合理的。考虑到现在500 MB的成本大约为10美元,我不会为此担心

500 MB的堆大小,这是不可能的

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

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

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


另一方面,如果你的意思是400万,而不是40亿,那么500MB的大小是相当合理的。考虑到现在500 MB的成本约为10美元,我不会为此担心。

因此,您正在浪费多达10美元的内存。您可以使用内存映射文件使其效率更高,并将使用的堆减少到1 MB以下。然而,这种复杂性不太值得。如果你想了解一个使用内存映射文件的库的话。。。我用类似的库在Java中加载了40亿行数据,我认为这已经足够有效了,除非你的机器没有500 MB的可用内存。你还得担心你的时间效率。你可以通过大约一两个月的工作来大幅削减这一成本你能为你的库写一个小教程吗,我如何在我的情况下使用它?单元测试中有多个例子。使用内存映射的问题在于,您需要时间来理解使用它所需的技能。我试图在这个论坛上帮助另一个人,一个月后,这一切对他来说都是神奇的。一个简单的教程不是问题,理解如何以原始字节映射出自己的数据结构是困难的部分。因此,您将浪费多达10美元的内存。您可以使用内存映射文件使其效率更高,并将使用的堆减少到1 MB以下。然而,这种复杂性不太值得。如果你想了解一个使用内存映射文件的库的话。。。我用类似的库在Java中加载了40亿行数据,我认为这已经足够有效了,除非你的机器没有500 MB的可用内存。你还得担心你的时间效率。你可以通过大约一两个月的工作来大幅削减这一成本你能为你的库写一个小教程吗,我如何在我的情况下使用它?单元测试中有多个例子。使用内存映射的问题在于,您需要时间来理解使用它所需的技能。我试图在这个论坛上帮助另一个人,一个月后,这一切对他来说都是神奇的。一个简单的教程不是问题,理解如何用原始字节映射出自己的数据结构是困难的部分。
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);
        }
    }