如何在读取/写入文件时克服硬件限制。

时间:2013-03-03 14:11:42

标签: java file file-io filestream bufferedreader

我最近在一次采访中被问到了这个问题。

  

给定输入文件,正则表达式和输出文件。读取输入文件,将每一行与正则表达式匹配,并将匹配的行写入输出文件。

我提出了使用链接到FileReader的BufferedReader(以优化磁盘读取)的粗略方案。我用了类似的写作方案。

  

然后采访者说这个过程需要3秒钟才能从文件中读取一行,1秒钟将正则表达式与行进行比较,另外5秒钟回写。所以每行总共需要9秒。我们该怎样改进这个?

我建议立即读取整个文件,处理它并立即写入整个输出文件。但是,我被告知不会有帮助(写1行= 5秒,写2行= 10秒)。

  

采访者进一步表示,这是由于硬件/硬盘限制。我被问到如何改进我的代码以减少每行的总秒数(目前为9)?

我只能想到缓冲的读/写,并且在SO上也找不到多少。有什么想法吗 ?

3 个答案:

答案 0 :(得分:2)

我认为面试官正在寻找一种能够在编写输出的同时执行读/正则检查的解决方案。如果您设置了一个通过读取和过滤异步填充的工作队列,并将写入放在一个单独的线程中,那么组合的过程每行需要五秒钟,从第二行开始。

这里的假设是阅读,解析和写作可以彼此独立地发生。在这种情况下,您可以在写入第1行时读取第2行:您只需要4秒钟即可读取和应用正则表达式,并且在写入器准备好第二行之前,您已经有整整5秒钟。写作仍然是你的瓶颈,但整个过程加快了44%,这还不错。

答案 1 :(得分:0)

因为读取的时间是固定的并且写入的时间是固定的,所以在这种情况下你唯一的选择就是改变正则表达式的性质。

你可以编写代码来快速应用正则表达式测试,而不需要正则表达式可以做的所有聪明事情的开销。

如果另一方面问题是每个IO请求需要几秒钟才能执行,但限制不是实际驱动器,那么有几个读取器同时读取。

答案 2 :(得分:0)

棘手的问题,因为我们对系统没有太多了解。

我的猜测是使用线程/异步处理。使用一个线程进行读取,使用一个线程处理两个或多个进行写入,从而减少IO等待所花费的时间。

让我尝试将其转换为ASCII图表:

  • R / r表示阅读(3秒)
  • P / p表示处理(1秒)
  • W / w表示写作(5秒)

大写字母标记开头,小写字母标记继续工作。 “:”表示线程空闲

Thread 1: RrrRrrRrrRrrRr
Thread 2: ...P..P..P..P.
Thread 3: ....Wwwww
Thread 4: .......Wwwww

使用此设置,第一批在9秒后写回(这里不多做),但第二批在12秒后完成。单线程第二个需要18秒总计