当给定一个MAX_BUFFER_SIZE的缓冲区以及一个远远超过该缓冲区的文件时,怎么办:
RandomAccessFile aFile = new RandomAccessFile(fileName, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(CAPARICY);
int bytesRead = inChannel.read(buffer);
buffer.flip();
while (buffer.hasRemaining()) {
buffer.get();
}
buffer.clear();
bytesRead = inChannel.read(buffer);
aFile.close();
InputStream in = new FileInputStream(fileName);
long length = fileName.length();
if (length > Integer.MAX_VALUE) {
throw new IOException("File is too large!");
}
byte[] bytes = new byte[(int) length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead = in.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + fileName);
}
in.close();
事实证明, 常规IO在执行与NIO相同的操作时快约100倍 。我想念什么吗?这是预期的吗?有没有更快的方法来读取缓冲区块中的文件?
最终,我正在处理一个大文件,但我没有足够的内存来一次读取所有文件。相反,我想逐步读取它,然后将其用于处理。
假设您需要一次将整个文件读入内存(就像您当前正在做的那样),那么读取较小的块和NIO都不会对您有所帮助。
实际上,您最好读取较大的块-常规IO代码会自动为您完成这些工作。
您的NIO代码目前较慢,因为您一次只能读取一个字节(使用buffer.get();
)。
如果要分块处理(例如,在流之间传输),这是在没有NIO的情况下进行处理的标准方法:
InputStream is = ...;
OutputStream os = ...;
byte buffer[] = new byte[1024];
int read;
while((read = is.read(buffer)) != -1){
os.write(buffer, 0, read);
}
这仅使用1 KB的缓冲区大小,但可以传输无限量的数据。
(如果您在功能级别上扩展了您实际想要做什么的详细信息,我可以进一步改善它以得到更好的答案。)
问题内容: 我在嵌入式Linux设备上使用Java 1.5,并且希望读取具有2MB int值的二进制文件。(现在是4字节的Big Endian,但我可以决定格式) 使用via 使用),这500 000个调用需要17秒才能读取,但是读入一个大字节缓冲区的文件需要5秒。 我如何更快地将该文件读入一个巨大的int []? 读取过程不应使用额外的512 kb。 下面使用的这段代码并不比java io中的r
问题内容: 我一直在寻找最快的方法来用有限的内存(大约64MB)在Java中再次读写大文件(0.5-1 GB),这是最快的方法。文件中的每一行代表一条记录,因此我需要逐行获取它们。该文件是普通文本文件。 我尝试了BufferedReader和BufferedWriter,但这似乎不是最好的选择。读写大小为0.5 GB的文件大约需要35秒钟,仅进行读写操作而不进行任何处理。我认为这里是写作的瓶颈,因
问题内容: 用Java的I / O方法读取相对较大的文件的最快方法可能是什么?我当前的解决方案使用BufferedInputStream保存到分配有1024个字节的字节数组。然后将每个缓冲区保存在中,以ArrayList备后用。整个过程是通过单独的线程(可调用接口)调用的。 虽然不是很快。 问题答案: 我将使用足够快的内存映射文件来在同一线程中执行。 这假定文件小于2 GB,并且将花费10毫秒或更
问题内容: 关于三个嵌套循环,我有三个问题: 而且我需要存储所有计算值。我的标准方法是使用3D阵列: 但是事实证明这很慢:完成此循环需要192毫秒,其中需要一个int分配 仅需66毫秒。 1)为什么数组这么慢? 2)为什么当我将其放入内部循环时它变得更慢: 这需要4秒钟以上! 3)最重要的是:我可以使用一种数据结构,该结构与分配单个整数一样快,但是可以存储与3D数组一样多的数据? 问题答案: 1)
问题内容: 目前,我正在使用扫描仪/文件阅读器,同时使用hasnextline。我认为这种方法效率不高。还有其他方法可以读取与此功能类似的文件吗? 问题答案: 您会发现这是所需的速度:您可以每秒读取数百万行。字符串拆分和处理很可能导致遇到的任何性能问题。
问题内容: 我有多个3 GB的制表符分隔文件。每个文件中有2000万行。所有行都必须独立处理,任何两行之间都没有关系。我的问题是,什么会更快A.使用以下命令逐行阅读: 还是B.将文件分块读取到内存中并进行处理,例如一次250 MB? 处理不是很复杂,我只是在column1到column2的值中抓取值,等等。可能需要将一些列值加在一起。 我在具有30GB内存的Linux机器上使用python 2.7