我正在处理许多千兆字节的文本数据,我想知道是否有办法提高性能。例如,当经历10千兆字节的数据而根本不进行处理时,只需逐行迭代,大约需要3分钟。
基本上我有一个包含BufferedReader的dataIterator包装器。我不断调用这个迭代器,它返回下一行。
问题是创建的字符串数量?或者可能是函数调用的数量。我真的不知道如何分析这个应用程序,因为它被编译为jar并用作STAF服务。
任何和所有想法都受到赞赏?
答案 0 :(得分:6)
让我们从基础开始:您的应用程序是I / O绑定的。由于对象分配,内存或CPU限制,您没有遇到性能不佳的问题。由于磁盘访问,您的应用程序运行缓慢。
如果您认为可以改进文件访问,则可能需要使用JNI进行低级编程。如果您自己更有效地处理文件访问,则可以改进文件访问,并且需要在较低级别上完成。
我不确定使用java.nio
会为您提供更好的性能,虽然它可以让您在I / O运行时更自由地进行CPU /内存密集型操作。 / p>
原因在于,java.nio
基本上使用选择器包装文件读取,让您在读取缓冲区时得到通知,确实为您提供了可能有助于提高性能的异步行为。但是阅读文件本身是你的瓶颈,而java.nio
并没有在这方面给你任何东西。
首先尝试一下,但我不会对它抱太大希望。
答案 1 :(得分:3)
我认为Java's NIO package对您的需求非常有用。
This Wikipedia article有一些关于“旧”Java I / O的具体改进的背景信息。
答案 2 :(得分:1)
使用NIO,通道,字节缓冲区和内存映射文件将为您提供最佳性能。它与你将要获得的硬件差不多。我有一个类似的问题,我不得不解析超过600万分隔的文本行(265MB文件),然后在行中的分隔列移动,然后将其写回。使用NIO和2002硬件需要33秒才能完成。诀窍是将数据保留为字节。你有一个线程读取数据来提取行,另一个线程来操作该行,第三个线程将其写回。
答案 3 :(得分:0)
如果程序是通过常规的“java -options ... ClassName args ...”命令行启动的,则可以对其进行概要分析。我最熟悉NetBeans Profiler。它有一种方法可以单独启动java应用程序(adding a java option to the startup),然后附加分析器。
如果你想在不衡量需要改进的情况下进行优化,那么你就是在黑暗中工作。你可能会很幸运,或者你可能会花很多时间做无关紧要的工作。