Java 如何克服读取/写入文件时的硬件限制。
我最近在一次采访中被问到这个问题 给定一个输入文件、一个正则表达式和一个输出文件。读取输入文件,将每一行与正则表达式匹配,并将匹配的行写入输出文件 我提出了使用链接到文件读取器的BufferedReader(优化磁盘读取)的粗略方案。我在写作中使用了类似的方案 采访者接着说,这个过程需要3秒钟来读取文件中的一行,1秒钟来比较正则表达式和该行,另外5秒钟来写回。所以每行总共需要9秒。我们如何才能改进这一点 我建议一次读取整个文件,处理它,然后一次写入整个输出文件。然而,有人告诉我这没用(写1行=5秒,写2行=10秒) 采访者进一步表示,这是由于硬件/硬盘驱动器的限制。有人问我如何改进代码以减少每行的总秒数(目前为9秒)Java 如何克服读取/写入文件时的硬件限制。,java,file,file-io,filestream,bufferedreader,Java,File,File Io,Filestream,Bufferedreader,我最近在一次采访中被问到这个问题 给定一个输入文件、一个正则表达式和一个输出文件。读取输入文件,将每一行与正则表达式匹配,并将匹配的行写入输出文件 我提出了使用链接到文件读取器的BufferedReader(优化磁盘读取)的粗略方案。我在写作中使用了类似的方案 采访者接着说,这个过程需要3秒钟来读取文件中的一行,1秒钟来比较正则表达式和该行,另外5秒钟来写回。所以每行总共需要9秒。我们如何才能改进这一点 我建议一次读取整个文件,处理它,然后一次写入整个输出文件。然而,有人告诉我这没用(写1行=5
我只能想到缓冲读/写,也找不到太多。有什么想法吗 我认为面试官正在寻找一种解决方案,在编写输出的同时执行读取/正则表达式检查。如果您设置了一个工作队列,通过读取和筛选异步填充,并将写入放在单独的线程中,那么组合的过程从第二行开始,每行需要5秒钟
这里的假设是,阅读、解析和写作可以彼此独立地进行。在本例中,您可以在写入第1行的同时读取第2行:您只需4秒钟即可读取并应用正则表达式,而在编写器准备好第二行之前,您还有整整5秒钟的时间。写入仍然是您的瓶颈,但整个过程加快了约44%,这还不错。既然读取时间是固定的,写入时间是固定的,在这种情况下,您唯一的选择就是更改正则表达式位的性质 您可以编写代码来快速应用regex测试,而无需使用regex所能做的所有聪明的事情
另一方面,如果问题是每个IO请求需要几秒钟才能执行,但限制不是实际驱动器,那么就让多个读卡器同时读取。这是一个棘手的问题,因为我们对系统没有太多了解 我猜应该使用线程/异步处理。使用一个线程进行读取,一个线程处理两个或更多线程进行写入,从而减少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秒多线程和同步?您不必等待1秒钟进行正则表达式处理,然后继续读取下一行。在regex处理终止后,另一个等待匹配行的线程可以写入输出。但我怀疑这最后一步是否会带来很大的改进,因为你有一张光盘,它在某一特定时刻读或写。