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

Java:如何更快地计算TB大小文件中的行数,java,Java,我们的文件平均大小为10 tb。我想知道是否有比这更好的方法使它更快 BufferedReader reader = new BufferedReader(new FileReader("file.txt")); int lines = 0; while (reader.readLine() != null) lines++; reader.close(); 我认为没有人能真正回答你的问题。以下是我需要给你一个好答案的缺失细节 您使用什么文件系统来存储10TB的文件? 如果它们真的是10TB,

我们的文件平均大小为10 tb。我想知道是否有比这更好的方法使它更快

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
int lines = 0;
while (reader.readLine() != null) lines++;
reader.close();

我认为没有人能真正回答你的问题。以下是我需要给你一个好答案的缺失细节

  • 您使用什么文件系统来存储10TB的文件? 如果它们真的是10TB,那么我假设您正在运行某种集群。您使用的是什么分布式文件系统
  • 你在运行什么操作系统? Linux/Win/etc
  • 您必须使用Java还是可以深入研究C/C++? 处理这么大的文件非常快,需要挂接到不可移植的系统调用
  • 你能在创建文件时写出行数吗? 如果在创建时只写行数,这个问题就会消失
  • 如果这是在集群上,您是否在本地处理该文件,然后进行处理
  • 您是否通过网络映射/装载驱动器并进行处理?如果是这样,则网络带宽限制您将10TB的文件从群集移动到工作站
  • 没有这6项,任何人都只是猜测


    更新OP响应:

    这里是我会做的信息

  • 在你做任何事情之前,你需要看看你的网络连接是否饱和。鉴于您在网络上处理大量数据,除了升级交换机和调整服务器上的网络堆栈之外,您可能无能为力。如果且仅当您确认您的网络连接未固定在100%以下,我将尝试其他方法

  • 从简单开始,在您的计算机上增加缓冲区大小,我认为java默认缓冲区大小为8192。根据HDFS文件系统设置和网络的不同,只需增加缓冲区大小,就可以获得显著的加速

  • 如果你还是慢,我会试着用
  • 还是慢?运行两个线程,一个从文件开始,一个从文件结束。像在步骤2中一样使用缓冲区大小
  • 如果你还是太慢了,你能直接连接到HDFS吗?如果您正在通过NFS挂载读取文件,那么直接挂接到HDFS可能会提高性能
  • 还慢吗??安装另一个网卡并通过通道连接将其连接到两倍的吞吐量,然后从步骤1开始:)

  • 祝你好运

    100tb,你是说100gb吗?为什么要创建这么大的文件?如果是100tb,那么我会首先重构创建如此大文件的代码。@Ros5292:这会更快吗?这能处理像我们这样的文件大小吗?分而治之模式?两个线程,一个从末尾开始,一个从开头开始。。但无法帮助您实现它。@Patty如果您正确,它不会更快,而是会耗尽内存。我应该删除我的评论。谢谢为什么?为什么您需要知道有多少行,而不进行处理?回答您的问题:1>创建文件并将其写入HDFS文件系统的是一个java多线程进程。2> Linux操作系统。3> Java 4>是的,我们正在这样做。然而,这是验证过程的一部分,需要这个用例5>我们直接用HDFS(分段)编写6>驱动器通过网络安装