2009-05-28 59 views
3

我正在处理许多GB的文本数据,我想知道是否有一种方法来提高性能。例如,当处理10千兆字节的数据并且根本不处理它时,只需逐行迭代,大约需要3分钟。改进BufferedReader速度

基本上我有一个dataIterator包装器包含一个BufferedReader。我不断地调用这个迭代器,它返回下一行。

问题是创建字符串的数量?或者可能是函数调用的次数。我真的不知道如何配置这个应用程序,因为它被编译为jar并用作STAF服务。

任何和所有的想法赞赏?

回答

6

让我们从基础开始:您的应用程序是I/O绑定的。由于对象分配,内存或CPU限制,您的性能不会受到影响。由于磁盘访问,您的应用程序运行缓慢。

如果您认为可以改进文件访问,则可能需要使用JNI进行低级编程。如果您自己更有效地处理文件,则可以提高文件访问权限,并且需要在较低级别上完成。

我不确定使用java.nio会为您寻找更好的性能,尽管它可能会让您在运行I/O时执行CPU /内存密集型操作时更加自由。

原因是基本上,java.nio用选择器包装文件读取,让您在读取缓冲区时使用通知,确实为您提供异步行为,这可能会有助于您的性能。但阅读文件本身是你的瓶颈,java.nio不给你在这方面的任何东西。

所以先试一下,但我不会让我的希望太高。

+3

真相。 3分钟内10GB为55MB /秒。这接近了基于磁盘的磁盘驱动器的传统读取性能。如果没有基于RAM的驱动器,你可能会在一个非常好的情况下增加一倍或三倍,就是这样。 – Jherico 2009-05-28 18:51:32

+0

Jherico>或“添加索引”或类似内容。 – 2009-05-28 19:03:01

+0

我不关注。如果你有IO界限,索引如何帮助你?它听起来不像是搜索就是应用程序,更像是日志处理或索引,您只需要按顺序浏览数据。 – Jherico 2009-05-28 19:33:48

3

我认为Java's NIO package将非常有用您的需求。

This Wikipedia article对“旧”Java I/O的具体改进有一些很好的背景信息。

+0

我会试试看。 – esiegel 2009-05-28 18:40:17

+0

不确定使用NIO将有助于读取性能本身。如果通过映射文件来读取,它可能会间接帮助* - 它应该停止从操作系统文件缓存中读取数据。 – 2009-05-28 20:18:12

0

如果程序通过常规“java -options ... ClassName args ...”命令行启动,则可以对其进行配置。我最熟悉NetBeans Profiler。它有一种方法来分别启动Java应用程序(adding a java option to the startup),然后连接分析器。

如果您尝试优化而不测量需要改进的部分,那么您就是在黑暗中工作。你可能会很幸运,或者你可能会花很多时间做无关紧要的工作。

+0

我将STAF服务编译成一个JAR,然后STAF被调用并合并了jar文件。我试着用Jconsole查看它,但由于某种原因,我无法连接。我在STAF论坛上发布了这个问题,但他们没有太多帮助。 – esiegel 2009-05-28 20:04:18

1

使用NIO,通道,字节缓冲区和内存映射文件将为您提供最佳性能。这与您将要获得的硬件差不多。我有一个类似的问题,我不得不解析超过600万个分隔的文本行(265MB文件),然后绕着行中的分隔列移动,然后将其写回。使用NIO和2002硬件需要33秒。诀窍是将数据保留为字节。您有一个线程读取数据以提取该行,另一个线程处理该行,第三个线程将其写回。