所以对于一些研究工作,我需要分析大量的原始运动数据(目前几乎是一亿的数据,而且还在不断增长),并给出定量的信息和曲线图。
我用groovy编写了它的大部分内容(jfreechart用于制图),当性能成为一个问题时,我用java重写了核心部分。
问题是,分析和绘图大约需要一分钟,而加载所有数据大约需要5-10分钟。可以想象,当我想对绘图做一些小的更改并查看输出时,这会变得非常烦人。
我有一些解决方法:
将所有数据加载到sqlite数据库中。
优点:会很快的。如果需要的话,我可以运行sql来获取聚合数据。
缺点:我必须写所有的代码。另外,对于一些绘图,我需要访问每个数据点,因此加载几十万个文件,有些部分可能仍然很慢。
javarmi返回对象。所有数据都被加载到一个根对象中,当序列化时,这个根对象大约是200兆字节。我不知道用rmi传输一个200毫克的物体需要多长时间(同一客户)。
我必须运行服务器并加载所有数据,但这不是什么大问题。
少校:这应该用最少的时间来写
在服务器vm中运行一个加载数据并在命令上执行groovy脚本的服务器。总的来说,这似乎是最好的主意(对于实现时间与性能以及其他长期利益而言)
我想知道的是是否有其他人解决了这个问题?
事后分析(3/29/2011):写了这个问题几个月后,我不得不学习r来运行一些统计数据。使用r进行数据分析和聚合要比我现在做的简单得多,也快得多。
最终,我使用java运行了初步聚合,然后在r中运行了其他所有东西。r也比使用jfreechart更容易制作漂亮的图表。
6条答案
按热度按时间inkz8wg91#
如果你需要大量的数据,数据库是非常可伸缩的。在mssql中,我们目前在4分钟内对大约30gb的数据进行分组/求和/过滤(我认为大约1700万条记录)。
如果数据增长不大,我会尝试第二种方法。您可以制作一个简单的测试应用程序,用随机数据创建一个200-400mb的对象,并测试传输它的性能,然后再决定是否要走这条路。
ruarlubt2#
啊,是的:java中的大型数据结构。祝你好运,从“垃圾收集死亡”中幸存下来。java似乎做得最好的是在其他处理引擎周围 Package 一个ui,尽管它可以让开发人员从大多数内存管理任务中解脱出来——这是有代价的。如果是我,我很可能会用perl进行大量的处理(由于性能原因,在过去的工作中不得不用perl而不是java重新编码批处理系统的几个部分),然后将结果返回到现有的绘图代码中。
但是,考虑到您建议的选择,您可能希望使用sqldb路由。只需确保对于一些示例查询来说速度确实更快,观察查询计划数据以及所有这些(假设您的系统将记录或以交互方式显示这些详细信息)
edit,(对jimferrans)re:javabig-n比perl快(下面的注解):您引用的基准测试主要是一些小的“算术”循环,而不是一些执行几百mb io并将其存储在map/%hash/dictionary/关联数组中以供以后重新访问的测试。javai/o可能已经变得更好了,但我怀疑所有的抽象性仍然使它相对缓慢,我知道gc是一个杀手。我最近没有检查过这个,我现在的工作不像以前那样每天处理多gb的数据文件。
喂食人魔(12/21):我认为perl比java做一堆连续的字符串处理要快。事实上,根据我使用的机器的不同,perl在这种工作(批处理+字符串)中的速度是java的3到25倍。当然,我编写的特定thrash测试不涉及任何数字工作,我怀疑java会做得更好,也不涉及在map/hash中缓存大量数据,我怀疑perl会做得更好。但是请注意,java在使用大量线程方面做得更好。
a6b3iqyw3#
如果您的数据具有关系属性,那么没有什么比将其存储在某个sql数据库中更自然的了。在这里,您可以解决最大的问题—性能,只需“花费”编写适当的sql代码。
我觉得很简单。
zzzyeukh4#
我建议运行一个探查器来查看加载过程中哪个部分花费的时间最多,以及是否有可能的快速优化。您可以下载jprofiler或您的工具包的评估许可证。
pn9klfpd5#
在做出决定之前,了解jvm以及物理系统资源的情况可能是值得的。
有几个因素可能在这里起作用:
jvm堆大小
垃圾收集算法
你有多少物理内存
你如何加载数据-它是从一个文件,是碎片遍布整个磁盘?
你甚至需要一次加载所有的数据-它可以批量完成吗
如果你是分批进行,你可以改变批量大小,看看会发生什么
如果您的系统有多个内核,那么您可以考虑一次使用多个线程来处理/加载数据
如果已经使用了多个内核并且磁盘i/o是瓶颈,那么您可以尝试同时从不同的磁盘加载
你还应该看看http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp 如果您不熟悉虚拟机的设置。
xqkwcwgp6#
我会用r进行分析。这是一种具有绘图功能的统计语言。它可以让你走在前面,特别是如果你想做这种分析的话。为什么要写这些代码?