java.lang.OutOfMemoryError 不断发生,存储一百万个字符串及其计数的更好方法是什么?

标签 java memory hashmap storage

我目前正在尝试将一百万个字符串及其计数存储到 HashMap 中。 但是,我的内存总是不够用。有没有更好的方法来做到这一点,以便我以后也可以为另一项任务保留其计数?

输入为: al = new String[]{"A", "C", "G", "T", "AC", "AG", "AT", "CG", "CT", "GT", "ACGT"};

public static Map < String, Integer > combinations(String[] al) {

    HashMap < String, Integer > consData = new HashMap < String, Integer > ();
    String nc;
    for (String s: al) {
      for (String k: al) {
        for (String l: al) {
          for (String m: al) {
            for (String n: al) {
              for (String o: al) {
                nc = s + "|" + k + "|" + l + "|" + m + "|" + n + "|" + o;
                consData.put(nc, 0);
                System.out.println(nc);
              }
            }
          }
        }
      }
}

最佳答案

从您的代码来看,您似乎需要存储数百万个字符串作为 map 的键。

我看到你在 map 上放了一个数字,最初是 0。

该值从 0 开始变化的频率是多少?如果这个值并不经常不同于零,那么你有一个 sparse matrix .

在这种情况下,您可以决定仅当数据的值不为零时才将数据存储在 map 中,并使用如下所示的方法来获取通用字符串的值:

public int getValue(String key) {
    Integer value = consData.get(key);
    if (value == null) {
        return 0;
    }
    return value;
}

如果该值是具有该键的现有元素的计数器,则添加方法可能如下:

public int addKey(String key) {
    Integer counter = consData.get(key);
    if (counter == null) {
        counter = 0;
    } 
    counter = counter + 1;
    consData.put(key, counter);        
}

当您有数百万个可能值,但其中只有少数有效时,通常会使用此解决方案

关于java.lang.OutOfMemoryError 不断发生,存储一百万个字符串及其计数的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33875594/

相关文章:

c - 堆栈上的数组内存分配

java - 哈希集可以在内部使用一些其他集合而不是 HashMap 吗

java - 通过引用填充HashMap

java - 使用 JSoup 修改内存中的 HTML

java - android - 如何检测正在激活的应用程序

java - 总(Tomcat)内存增加但堆没有

java - 找到Hashmap中的几个最大值

java - 通过远程桌面共享查看时,未修饰的 JInternalFrame 会变成修饰的

java - 如何使用 Retrofit 创建 NTLM 身份验证

php - 教义刷新更改并释放内存