【发布时间】:2017-09-10 06:51:12
【问题描述】:
在开始解释我的问题之前,我应该提一下,我并不是在寻找增加 Java 堆内存的方法。我应该严格存储这些对象。
我正在努力将大量(5-10 GB)的 DNA 序列及其计数(整数)存储在哈希表中。 DNA 序列(长度为 32 或更少)由“A”、“C”、“G”、“T”和“N”(未定义)字符组成。众所周知,在内存中存储大量对象时,与 C 和 C++ 等低级语言相比,Java 的空间效率较差。因此,如果我将此序列存储为字符串(它为长度约为 30 的序列保存大约 100 MB 内存),我会看到错误。
我试图将核酸表示为 'A'=00, 'C'=01, 'G'=10, 'T'=11 并忽略 'N'(因为它破坏了 char 到 2 位的转换为第五酸)。然后,将这些 2 位酸连接成字节数组。它带来了一些改进,但不幸的是,几个小时后我又看到了错误。我需要一个方便的解决方案或至少一个解决方法来处理此错误。提前谢谢你。
【问题讨论】:
-
你需要增加 Java 内存。你给 JVM 多少钱?
-
你能把你的问题分成可以顺序解决的等价子问题吗?即如果我需要对 1000 个数字求和,我可以将这个问题分成 10 个子问题,每个子问题由 100 个数字相加,然后对部分结果求和
-
@stdunbar 大约 2 GB。正如我所说,我应该继续使用 JVM 的默认设置。最有可能的是,如果我为 JVM 分配 10 GB,程序将运行而不会出错。
-
@FedericoPeraltaSchaffner 如果任务是找到最频繁的 N 个子序列及其频率怎么办?是的,我可以将问题拆分为 B 个子问题。然后,对于每个子问题,我可以选择 K 个最频繁的子序列。最后,我合并所有 (B*K) 子序列并将非唯一子序列分组以“近似”找到它们的频率。可以从这个近似列表中选择最频繁的 N 个后续,但我需要准确的结果。
-
好的,如果您需要精确的结果并且您的问题不能被拆分为返回精确结果的子问题,并且如果您需要使用的数据结构不适合可用内存,那么您需要开始考虑使用数据库。
标签: java performance hashmap