Java 当迭代次数以百万计时,打印循环状态的有效方法是什么

Java 当迭代次数以百万计时,打印循环状态的有效方法是什么,java,algorithm,data-structures,Java,Algorithm,Data Structures,假设我逐行读取一个文件(包含8亿行),然后处理数据(非常轻的处理,基本上格式化字符串),然后将处理后的行写入另一个文件 如果我想为从文件中读取的每100万行打印一条语句,一种基本方法是添加一条检查迭代变量的If语句,对于每%000000==0,我打印一条语句 现在,这段代码在每次迭代中检查索引是否达到下一个百万,这是每次迭代中的额外处理,对吗 有没有其他有效的方法可以做到这一点,只有当迭代索引变量达到百万的倍数时,才会发送一些信号并打印语句 现在,这段代码在每次迭代中检查索引是否达到下一个百万,

假设我逐行读取一个文件(包含8亿行),然后处理数据(非常轻的处理,基本上格式化字符串),然后将处理后的行写入另一个文件

如果我想为从文件中读取的每100万行打印一条语句,一种基本方法是添加一条检查迭代变量的If语句,对于每%000000==0,我打印一条语句

现在,这段代码在每次迭代中检查索引是否达到下一个百万,这是每次迭代中的额外处理,对吗

有没有其他有效的方法可以做到这一点,只有当迭代索引变量达到百万的倍数时,才会发送一些信号并打印语句

现在,这段代码在每次迭代中检查索引是否达到下一个百万,这是每次迭代中的额外处理,对吗

正确的

有没有其他有效的方法可以做到这一点,只有当迭代索引变量达到百万的倍数时,才会发送一些信号并打印语句

不,没有

但不要担心这是“低效的”。测试的成本很可能比读取和处理数据的成本低2个或更多数量级

1-经过反思,在某些情况下,减少专用计数器并测试其是否为零可能更有效。此外,如果计数器溢出,“%”方法将无法正常工作



一般性建议。不要花时间“优化”这个级别的东西,除非你有证据证明你有瓶颈。您需要使用真实数据分析应用程序,以便决定是否值得优化应用程序的这一方面。

在我的机器上,以下操作需要1.4秒:

    for (int i = 0; i < 800000000; ++i) {
        if (i % 1000000 == 0) {
            System.out.print('.');
        }
    }
for(int i=0;i<80000000;++i){
如果(i%1000000==0){
系统输出打印('.');
}
}

这表明你会没事的。但是,如果有疑问,配置文件。

您有800M行文本数据,需要进行处理,然后复制到单个文本文件中

  • 我更喜欢一个公共参数“NotifyAfter”,在您的例子中是 1米
  • 然后,如果需要,我可以将800M行打断为{NotifyAfter}批 并将它们存储在带有{Start,End}的数组或队列中
  • 现在我可以产生一些线程,我必须小心 这里的争用/死锁,因为它们都从同一个文件读取
  • 然后,每个子流程将完成其工作并引发一个事件- TaskComplete(增加处理的行数)
    • 在这里,您必须决定线程是否将所有内容写入 较小的文件,然后将它们粘在一起
    • 或者,您可以同步代码以写入同一文件
我同意斯蒂芬的观点——除非有证据表明存在瓶颈,否则不要优化


希望这有帮助

如果你想要一个线性的解决方案,这不可能是Stephen C所说的最佳方法

但是当我们谈论并行性时,有一个最佳的解决方案

例如,如果在另一个处理器上工作的另一个线程可以访问您的迭代过程状态,那么它可以告诉您在给定时间点的状态,而不会中断您的迭代过程

它也是最佳的,因为打印状态会花费迭代过程Θ(0),因为它是由外部线程在并行处理流\处理器上完成的


希望这有帮助

不,你很好。您是否测量并发现该检查是一个瓶颈?最小优化。将其与一个线程处理队列和一个线程将队列写入文件进行比较。(在您的情况下,队列开销可能太大。)那么每秒写入进度的计时器呢?