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

时间:2013-03-21 12:23:10

标签: java algorithm data-structures

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

如果我想为从文件中读取的每100万行打印一个语句,一个基本的方法是添加一个if语句来检查迭代变量,并且对于每百万个== 0,我打印语句。

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

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

4 个答案:

答案 0 :(得分:3)

  

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

正确

  

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

没有 1

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

1 - 在反射时,在某些情况下,递减专用计数器可能更有效,并测试它是否为零。此外,如果计数器溢出,'%'方法将无法正常工作。


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

答案 1 :(得分:3)

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

    for (int i = 0; i < 800000000; ++i) {
        if (i % 1000000 == 0) {
            System.out.print('.');
        }
    }

这表明你会没事的。但是,如果有疑问,请参阅。

答案 2 :(得分:1)

如果您想要线性解决方案,那么 Stephen C 所说的最佳方式是不可能的,

但是当我们谈论Parallelism时,有一个最佳解决方案,

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

它也是最优因为打印状态会使您的迭代过程花费Θ(0),因为它是由外部线程通过并行处理流程\处理器

希望这有帮助

答案 3 :(得分:0)

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

  • 我更喜欢公开参数“NotifyAfter”,在您的情况下 1M。
  • 然后,如果需要,我可以将800M行分成{NotifyAfter}批次 并使用{Start,End}将它们存储在数组或队列中。
  • 现在我可以产生一些线程,我必须要小心 这里是Race / Deadlock,因为它们都是从同一个文件中读取的。
  • 每个子流程将完成它的工作并举办活动 - TaskComplete(增加处理的行数)
    • 在这里你必须决定 - 你的线程是否写入了所有内容 较小的文件,然后你把它们连接起来
    • 或者您可以同步代码以写入同一文件。

我同意斯蒂芬 - 不要优化,除非有瓶颈的证据

希望这会有所帮助!!