用Java从文件中读取整数的最快方法是什么?

如何解决用Java从文件中读取整数的最快方法是什么?

| 我有一个这样排列的整数文件
1 2 3 55 22 11 (and so on)
而且我想尽快读取这些数字,以减少程序的总执行时间。到目前为止,我使用的扫描仪效果很好。但是,我感觉到存在可以使用的更快的IO实用程序。谁能指出我正确的方向? 编辑: 因此,是的,通过在Java代码周围设置不同的计时器并比较结果,我验证了程序中的IO占用最多的时间。     

解决方法

当前文件格式 如果数字表示为“ 1”,则没有更快的方法来读取和解析它们,磁盘I / O将比CPU所执行的任何操作都要慢几个数量级。唯一可以做的就是使用具有巨大缓冲区大小的
BufferedReader
,并尝试在使用
Scanner
之前获取内存中的所有文件(如果不是全部)。 备用文件格式 如果可以在文件中将它们表示为二进制文件并使用
DataInputStream
类读取数字,则I / O时间可能会略有减少,而CPU的边际减少可能是因为您不需要将
String
表示解析为除非您的输入文件以数百兆字节或更大为单位,否则无法测量“ѭ6”。 **缓冲输入流将仍然比其他效果更有效,在这种情况下,请使用ѭ7。 如何优化 您需要强大的性能分析,甚至可以检测出所做的任何更改对性能产生正面或负面影响。 如果您一遍又一遍地读取同一文件,则操作系统磁盘缓存之类的操作会歪曲基准,操作系统将对其进行缓存并破坏基准。了解足够好的是早于晚。   “我们应该忘记小事   效率,约占97%   时间:过早的优化是   万恶之源\“-Donald Knuth Kunth的报价的过早部分是重要的部分,它意味着: 在没有概要分析和基准测试的情况下,请勿进行优化,以验证您所做的更改实际上是瓶颈,并且可以衡量更改的积极或负面影响。 这是一个比较快速的基准,将
BufferedInputStream
读取相同的二进制数集与
Scanner
后面的
BufferedReader
支持读取与ѭ11分隔符的文本表示形式相同的数字集。 结果非常一致: 在配备8GB RAM的Core i3笔记本电脑上获取1,000个号码
Read binary file in 0001 ms
Read text file in   0041 ms
配备8GB RAM的Core i3笔记本电脑上的1,000,000个号码
Read binary file in 0603 ms
Read text file in   1509 ms
配备8GB RAM的Core i3笔记本电脑上的5000万个号码
Read binary file in 29020 ms
Read text file in   70346 ms
50,000个数字的文件大小如下:
 48M input.dat
419M input.txt
读取二进制数要快得多,直到数字集变得非常大为止。二进制编码的int的I / O更少(大约10倍),没有
String
解析逻辑,以及对象创建的其他开销以及
Scanner
所做的任何其他事情。我继续使用
InputStream
Reader
类的
Buffered
版本,因为它们是最佳实践,应尽可能使用。 为了获得额外的奖励,压缩将进一步减少大文件的I / O等待时间,而对CPU时间几乎没有可测量的影响。     ,通常,您可以在磁盘允许的速度下读取数据。更快地读取它的最佳方法是使其更紧凑或获得更快的磁盘。 对于您使用的格式,我将压缩文件并读取压缩的数据。这是提高读取基础数据的速率的简单方法。     ,升级可能性: 购买更快的磁盘。 购买固态硬盘。 将文件存储在ramdisk中。 在获得更高的性能/速度方面始终存在一个权衡。上述方法将花费金钱,并且必须在每台主机上执行,因此,如果该程序出售给多个客户,则最好使用算法,这样可以节省每台主机的资金,这是一个更好的选择。程序运行。 如果压缩文件或存储二进制数据,则可以提高读取速度,但是使用独立工具检查数据将更加困难。当然,我们无法确定这种情况可能发生的频率。 在大多数情况下,我建议您保留人类可读的数据,并使用较慢的程序,但是当然,这取决于丢失的时间,丢失的频率等等。 也许这只是一项锻炼,以找出您能获得多快的速度。但是,然后我要警告这种习惯,即始终在不考虑折衷和成本的情况下始终达到最高性能。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?