【问题标题】:Does separating read/write operations improve program efficiency?分离读/写操作会提高程序效率吗?
【发布时间】:2015-06-07 23:41:19
【问题描述】:

我已经为类编写了一个程序,它从 URL 中获取数据,解析它的关键短语,然后将短语、行号和列号写入文本文件。

目前我将其作为单个操作执行,其中 URL 被馈送到 BufferedReader 进行读取,馈送到 Scanner 进行解析,然后进入一个循环,其中每一行都被梳理并使用一系列条件语句来检查所述关键短语的存在。当找到匹配项时,我会写入文件。

读取的文件大约有 60K 行文本,从开始到结束运行此完整操作平均需要大约 4000 毫秒。拆分任务并首先将文件读入数据结构,然后将结果输出到文件而不是同时执行这两个操作会更有效吗?

另外,从 URL 中提取数据与在本地读取数据相比有多大影响?我可以选择两者都做,但我认为这取决于我的宽带速度。

编辑:有点不错的测试用例。过去一周,我们更换了 ISP 并将我们的宽带速度从 6Mb/sec 升级到 30Mb/sec。这使我的平均读取/解析/写入时间降至 1500 毫秒。有趣的是,小差异会对性能产生如此影响。

【问题讨论】:

  • 分析您的代码。找到瓶颈
  • 4000 毫秒的大部分时间可能都花在了算法上。因此,只要算法无法优化,您对网络和文件操作的操作并不重要。不过,我宁愿先读入所有数据以释放网络资源(这样它们就不会被冗长的解析过程所束缚)。可能没什么大不了的。
  • 您应该尽可能避免将整个文件或 URL 内容读入内存。它不会扩展并增加延迟。
  • 是的,我打算尝试几种不同的方法来更好地了解我会得到什么类型的性能结果。我想我会先寻求一些更有经验的建议,这样我才能更好地理解我的发现。

标签: java algorithm performance file-io data-structures


【解决方案1】:

这取决于您在数据处理部分实现并行性的方式。

此时您顺序读取所有内容 - 然后处理数据 - 然后写入。所以即使你把它分成 3 个线程,每个线程都取决于前一个的结果。

因此,除非您在数据完全接收之前开始处理数据,否则这不会产生影响,只会增加开销。

您必须模拟生产者/消费者,例如流程,例如行被单独读取,然后放入工作队列进行处理。处理后的行也是如此,然后将其放入队列中以写入文件。

这将允许并行读取/处理/写入操作。

顺便说一句 - 您可能主要受到从 URL 读取文件的速度的限制,因为所有其他步骤都在本地发生并且速度要快几个数量级。

【讨论】:

  • 感谢您如此深思熟虑的回应。这里可能是一个微不足道的问题,但这对我来说是一个新领域,因为我的 CS 课程终于开始深入研究真正的理论。我正在做的作业只是暑期课程的第一个任务,我假设它会引发辩论并推动课堂向前发展。尽管如此。以前我在 WebDev 中完成了 AS 并满足了我的 Uni 传输要求,回顾它与我现在正在处理的相比感觉如此机械。我想随着时间的推移,我会更多地参与 SO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多