【问题标题】:Maximum buffer size of BufferedReader [duplicate]BufferedReader 的最大缓冲区大小 [重复]
【发布时间】:2014-07-23 08:11:01
【问题描述】:

我有一个大文件(50-60GB)

我也有不错的机器(128GB RAM and 16 core)

现在,我想读取整个文件并进行一些操作。另请注意,该文件是二进制文件,所以reading as string or as bytes doesn't matter 对我来说。我的 IO 很慢,所以我想到了在 BufferedReader 的缓冲区中读取整个文件。

但是buffered reader's constructor让我失望了。

现在,我最多可以拥有2G buffer 的大小。这对我来说会很痛苦,因为我必须从 IO 阅读 30 次。

查看BufferedReader的方法,似乎没有一个超过2G标记(甚至this read函数)

我看错课程了吗?

java 中有没有其他类适合我的要求?

我的主要要求是我可以承受初始加载时间,并且我想利用 128G 内存。

谢谢

【问题讨论】:

  • 您是否实际测量过速度与缓冲区大小的关系?试试 128k、1M、8M、64M、512M、2G。
  • 文件读取是一个非常缓慢的过程。它与您的 RAM 无关,而是与磁盘搜索硬件的速度有关。一个更好的范例是读取一个固定的数据表单文件块并让执行器在块中找到数据。通过这种方式,您可以利用并发性并加快处理速度。这里唯一需要记住的是确保块不会太小以至于执行程序在新块可用之前完成处理,反之亦然。
  • @Nazgul 那将是完美的。我有128G内存,所以我想与其读多次,不如只读一次(我可以承受初始加载时间)。
  • 您无法使用BufferedReader, 读取二进制文件,但无论如何您的 I/O 并不是“非常慢”。您可以使用BufferedReader, 每秒读取数百万行,并且设置巨大的缓冲区大小不会对此产生实质性影响。缓慢的是您的处理。 例如,如果您将每一行连接到一个字符串,您将很快陷入困境。尝试找到一种方法一次处理该行。
  • 一次性读取文件中的所有数据最终将“将所有文件数据存储在内存中”。也像 EJP 所说,您不能使用BufferedReader 读取二进制文件。Reader 类of File IO 适用于基于字符的流。您应该改用BufferedInputStream

标签: java io bigdata bufferedreader


【解决方案1】:

沿着 IO 阶梯下降 30 次不会损害程序的性能。将 2G 从磁盘读取到 RAM 所需的时间(数秒,即使在强大的机器上也是如此)完全使进出本机代码的成本相形见绌,这大约是几毫秒,最高。

您在做什么需要您将整个文件保存在内存中?不能简单的做串行处理吗?

【讨论】:

  • 我需要计算文件中的唯一行。
  • 只需流式传输输入并将每一行放入HashSet 中找到它。
  • 其实我可以使用内存映射IO来满足我的需求。谢谢大家...
猜你喜欢
  • 2013-06-03
  • 2011-06-06
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多