Java-读取字节数组中的文件

Java-读取字节数组中的文件,java,database,Java,Database,我想将1.5 GB的文件读入数组,我想把它换成其他的选项。有人能帮我吗 如果我将字节文件预处理到某个数据库中(或者可能是以其他方式),我可以使它更快吗 有人能帮我吗?有没有别的办法使它更快 实际上,我需要处理超过50个1.5GB的文件。所以,这对我来说相当昂贵。您的磁盘子系统有多快 如果每秒可以读取40MB,那么读取1500MB大约需要40秒。如果您想比这更快,您需要一个更快的磁盘子系统。如果您正在从本地驱动器读取数据,并且需要几分钟的时间,那么您就有一个调优问题,而您无法用Java来解决这个问

我想将1.5 GB的文件读入数组,我想把它换成其他的选项。有人能帮我吗

如果我将字节文件预处理到某个数据库中(或者可能是以其他方式),我可以使它更快吗

有人能帮我吗?有没有别的办法使它更快


实际上,我需要处理超过50个1.5GB的文件。所以,这对我来说相当昂贵。

您的磁盘子系统有多快

如果每秒可以读取40MB,那么读取1500MB大约需要40秒。如果您想比这更快,您需要一个更快的磁盘子系统。如果您正在从本地驱动器读取数据,并且需要几分钟的时间,那么您就有一个调优问题,而您无法用Java来解决这个问题,因为这不是问题所在


您可以使用内存映射文件,但这只会在不需要所有数据的情况下加快访问速度。如果您需要这一切,您将受到硬件速度的限制。

使用BufferedInputStream或InputStream可能与您所能获得的速度一样快(比RandomAccessFile更快)。最大的int大小是2147483647,因此您的数组1610612736也将是数组的最大大小

我建议您使用BufferedInputStream访问文件以获得最佳速度,使用skip()和read()获取所需数据。也许有一个类实现了这些,知道它的位置,并在您向它发送一个要读取的偏移量时负责查找。我相信您可以关闭并重新打开输入流,以便将其放回初始位置


而且。。。您可能不想将它们保存在数组中,只需要根据需要从文件中访问它们。如果加载时间是你的杀手,这可能会有所帮助。

这取决于你想做什么

如果您只想访问几个随机字节,那么读取数组是不好的——MappedByteBuffer会更好

如果您希望读取所有数据并一次顺序处理一小部分数据,则可以对其进行流式处理

如果您需要进行随机访问整个数据集的计算,特别是如果您需要重复读取元素,那么将其加载到数组中可能是明智的(但ByteBuffer仍然是一种候选方法)


您可以展示一些示例代码或进一步解释吗?

为什么要将它们读入数组?为什么要读入50个这样的文件?你打算用它们做什么?你也许可以把速度提高一点,但真正的成功之处在于保留了那么多的内存和磁盘io。解决这个问题的方法是基本上不将其加载到数组中。那么,为什么要加载所有元素?@MarkusMikkolainen,用于访问数组元素(非顺序),然后处理元素(如与其他元素比较)并打印。如何处理它们?您可以使用RandomAccessFile从磁盘或其他地方访问它们吗?或者MMAP文件?如果你真的不需要读取每个字节,那么加快速度的一个方法就是不读取整个文件。如果您需要每个字节,那么您可以通过只读取每个字节一次来尝试改进。@MarkusMikkolainen,我需要处理每个字节。那么您就是SOL,购买更快的disk.filechannel.map并访问MappedByteffer可能是访问文件的最快方式,因为我认为它是以非常高效的方式实现的(因为它是平台代码)嘿,对我来说,在我的桌面上,读取一个1.25GB的文件需要354毫秒,而这个文件恰好已经在操作系统缓存中了。因此,即使使用fileInputstream,java也不应该是个问题