如何在Java中有效地处理字符串

时间:2014-10-14 12:38:07

标签: java

我在java中面临一些优化问题。我必须处理一个有5个属性的表。该表包含大约5百万条记录。为了简化问题,我要说我必须逐一阅读每条记录。然后我必须处理每条记录。从每条记录我必须生成一个有500个节点的数学网格结构。换句话说,每条记录产生500多条新记录,可以称为原始记录的父记录。总共有500 X 5百万条记录,包括原始加父记录。现在的工作是找出所有500 X 5百万条记录及其频率的不同记录数。目前我已经解决了这个问题如下。我将每个记录转换为一个字符串,每个属性的值用“ - ”分隔。我将它们计算在java HashMap中。由于这些记录涉及中间处理。记录将转换为字符串,然后在中间步骤中返回到记录。代码经过测试,工作正常,可以为少量记录生成准确的结果,但无法处理500 X 5百万条记录。 对于大量记录,它会产生以下错误

java.lang.OutOfMemoryError: GC overhead limit exceeded

据我所知,不同记录的数量肯定不会超过5万。这意味着数据不应导致内存或堆溢出。可以任何人建议任何选择。我将非常感激。

3 个答案:

答案 0 :(得分:1)

最有可能的是,你在某个地方有一些数据结构,这些数据结构保留了对已处理记录的引用,也称为内存泄漏"。听起来你打算依次处理每个记录然后扔掉所有中间数据,但实际上中间数据是保持不变的。如果你有一些集合或某些东西仍然指向它,垃圾收集器就不能丢弃这些数据。

另请注意,有一个非常重要的java运行时参数" -Xmx"。没有任何比你提供的更详细的信息,我会认为50,000条记录很容易适应默认值,但可能没有。尝试加倍-Xmx(希望你的计算机有足够的RAM)。如果这解决了问题那么好。如果它只是在它失败之前让你两次,那么你知道它是一个算法问题。

答案 1 :(得分:0)

使用sqlite数据库可以用来安全(1.3tb?)数据。使用查询,您可以找到快速信息。当程序结束时,数据也会被保存。

答案 2 :(得分:0)

您可能需要采用不同的方法来计算出现频率。当你只有几百万时,蛮力很棒:)

例如,在计算“晶格结构”之后,您可以将其与原始数据相结合,并采用MD5或SHA1。这应该是唯一的,除非数据不是“不同的”。然后应该将总数据减少到500万以下。