加载和分析大量数据

时间:2009-11-04 01:57:04

标签: java groovy

因此,对于一些研究工作,我需要分析大量的原始运动数据(目前几乎是数据并且不断增长)并吐出定量信息和图表。

我使用Groovy编写了大部分内容(使用JFreeChart进行制图),当性能成为问题时,我用Java重写了核心部分。

问题是分析和绘图需要大约一分钟,而加载所有数据大约需要5-10分钟。正如你可以想象的那样,当我想对绘图做一些小改动并看到输出时,这真的很烦人。

我有几个想法来解决这个问题:

  1. 将所有数据加载到SQLite数据库中 优点:它会很快。如果需要,我将能够运行SQL来获取聚合数据。

    缺点:我必须编写所有代码。此外,对于某些图,我需要访问每个数据点,因此加载几十万个文件,某些部分可能仍然很慢。

  2. Java RMI返回对象。所有数据都被加载到一个根对象中,当序列化时,该对象大约为200兆。我不确定通过RMI传输200meg对象需要多长时间。 (同一客户)。

    我必须运行服务器并加载所有数据,但这不是什么大问题。

    主要职业:这应该花费最少的时间来写

  3. 运行一个加载数据的服务器,并在服务器vm内的命令上执行groovy脚本。总的来说,这似乎是最好的想法(实施时间与性能以及其他长期效益)

  4. 我想知道的是还有其他人解决了这个问题吗?

    后期分析(2011年3月29日):在写完这个问题几个月后,我最终不得不学习 R 来运行一些统计数据。使用 R 进行数据分析和聚合比我正在做的更容易,更快捷,更快捷。

    最终,我最终使用Java运行初步聚合,然后在 R 中运行其他所有内容。 R 制作漂亮的图表比使用JFreeChart更容易。

6 个答案:

答案 0 :(得分:5)

如果要获得大量数据,数据库的可扩展性非常高。在MS SQL中,我们目前在4分钟内对大约30GB的数据进行分组/求和/过滤(我认为大约有1700万条记录)。

如果数据不会增长很多,那么我会尝试方法#2。您可以创建一个简单的测试应用程序,使用随机数据创建一个200-400mb的对象,并在决定是否要使用该路径之前测试传输它的性能。

答案 1 :(得分:2)

在做出决定之前,可能需要了解JVM的运行情况以及物理系统资源。

有几个因素可以在这里发挥作用:

  • jvm堆大小
  • 垃圾收集算法
  • 你有多少物理记忆
  • 如何加载数据 - 是来自整个磁盘碎片的文件吗?
  • 你甚至需要一次加载所有数据 - 可以批量完成吗
  • 如果您分批进行,可以改变批量大小,看看会发生什么
  • 如果您的系统有多个内核,也许您可​​以一次使用多个线程来处理/加载数据
  • 如果已经使用多个核心且磁盘I / O是瓶颈,也许你可以尝试同时从不同的磁盘加载

如果您不熟悉VM的设置,还应该查看http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

答案 2 :(得分:1)

如果您的数据具有关系属性,那么没有什么比将其存储在某个SQL数据库中更自然的了。在那里,你可以解决你最大的问题 - 性能,花费“只是”来编写适当的SQL代码。

对我来说非常明白。

答案 3 :(得分:1)

我会研究使用R的分析。它是一种具有图形功能的统计语言。它可以让你领先,特别是如果那是你打算做的那种分析。为什么要编写所有代码?

答案 4 :(得分:0)

我建议运行一个分析器来查看加载过程的哪个部分花费的时间最多,以及是否有可能快速获胜的优化。您可以下载JProfilerYourKit的评估许可。

答案 5 :(得分:-4)

啊,是的:Java中的大型数据结构。祝你好运,幸存"death by garbage collection"。 java似乎做得最好的是围绕其他处理引擎包装UI,尽管它可以从大多数内存管理任务中解放开发人员 - 只需付出代价。如果是我,我很可能会在Perl中进行繁重的处理(由于性能原因,我不得不在perl中重新编写几个批处理系统的块而不是java),然后将结果吐回到现有的图形代码中

但是,根据您的建议选择,您可能希望使用SQL DB路由。只需确保一些示例查询确实更快,查看查询计划数据以及所有这些(假设您的系统将记录或以交互方式显示此类详细信息)

编辑,(对Jim Ferrans)回复:java big-N比perl更快(下面的评论):你引用的基准测试主要是很少的“算术”循环,而不是几百MB的IO并存储它在Map /%hash / Dictionary / associative-array中,以便以后重新访问。 Java I / O可能会变得更好,但我怀疑所有的抽象性仍然会使它变得比较慢,而且我知道GC是一个杀手。我最近没有检查过,我不像以前那样每天处理多GB数据文件。

喂养巨魔(12/21):我measured Perl to be faster than Java for doing a bunch of sequential string processing。实际上,根据我使用的机器,Perl比这种工作(批处理+字符串)的Java快3到25倍。当然,我放在一起的特定捶打测试不涉及任何数字工作,我怀疑Java会做得更好,也不涉及在Map / hash中缓存大量数据,我怀疑Perl会有做得好一点。请注意,Java在使用大量线程方面做得更好。