Java:如何以更快的方式计算TB大小文件中的行数

时间:2019-03-19 22:19:10

标签: java

我们的文件平均大小为10 TB。想知道是否有比这更好的方法呢?

style

1 个答案:

答案 0 :(得分:3)

我认为没有人能按要求真正回答您的问题。这是我真正需要给您一个很好答案的一些遗漏细节。

  1. 您使用什么文件系统存储10TB文件? 如果它们确实是10TB,那么我假设您正在运行某种集群。您正在使用哪种分布式文件系统?
  2. 您正在运行什么操作系统? Linux / Win / etc。
  3. 您必须使用Java还是可以深入研究C / C ++? 处理如此大的文件真的非常快,这需要将其挂接到非可移植的系统调用
  4. 创建文件时可以写出行数吗? 如果仅在创建时写行数,则此问题就消失了。
  5. 如果这是在群集上,您是在本地处理文件然后进行处理吗?
  6. 您是否正在通过网络映射/安装驱动器并进行处理?如果是这样,那么您将受到网络带宽的限制,无法将10TB文件从群集移至工作站

没有这6个项目,任何人都只是猜测。


使用OP响应进行更新:

这就是我将给出的信息。

  1. 在执行所有操作之前,您需要查看是否已使网络连接饱和。鉴于您正在通过网络处理大量数据,因此除了升级交换机和调整服务器上的网络堆栈之外,您无能为力。当且仅当您确认您的网络连接未固定在100%以下时,我才会尝试其他方法。

  2. 从简单开始,增加BufferedReader上的缓冲区大小,我认为Java默认将缓冲区大小设置为8192。根据您设置HDFS文件系统和网络的方式,您可能仅通过增加缓冲区大小就可以大大提高速度。

  3. 如果您仍然很慢,我会尝试使用File channel
  4. 还是慢吗?从文件开头运行两个线程,从结尾运行一个线程。像在步骤2中一样,使用缓冲区大小进行播放。
  5. 如果您仍然太慢,可以直接加入HDFS吗?如果您正在通过NFS挂载读取文件,则直接挂接到HDFS上可能会提高性能。
  6. 还是慢吗?安装另一块网卡并进行通道绑定以使吞吐量翻倍,然后从步骤1开始:)

祝你好运!