0

我想将一个 1.5 GB 的文件读入一个数组。现在,由于需要很长时间,我想将其切换到其他选项。有谁能够帮助我,

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

任何人都可以帮助我有没有其他方法可以让它更快。

实际上,我必须处理超过 50 个 1.5GB 的文件。所以,这样的手术对我来说是相当昂贵的。

4

3 回答 3

1

你的磁盘子系统有多快?

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

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

于 2012-07-31T17:22:49.380 回答
1

这取决于你想做什么。

如果您只想访问几个随机字节,那么读入数组并不好 - MappedByteBuffer 会更好。

如果您想读取所有数据并一次按顺序处理一小部分,那么您可以流式传输它。

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

你能展示一些示例代码或进一步解释吗?

于 2012-07-31T19:22:53.890 回答
0

使用 BufferedInputStream 或 InputStream 可能会尽可能快(比 RandomAccessFile 快)。最大的 int 大小是 2,147,483,647,因此您的数组 1,610,612,736 也将是数组的最大大小。

我建议您使用 BufferedInputStream 访问文件以获得最佳速度,使用 skip() 和 read() 来获取您想要的数据。也许有一个实现这些的类,知道它的位置,并在你发送一个偏移量来读取时照顾你的寻找。我相信您关闭并重新打开输入流以将其放回开头。

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

于 2012-07-31T17:30:36.620 回答