Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何克服读取/写入文件时的硬件限制。_Java_File_File Io_Filestream_Bufferedreader - Fatal编程技术网

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

Java 如何克服读取/写入文件时的硬件限制。,java,file,file-io,filestream,bufferedreader,Java,File,File Io,Filestream,Bufferedreader,我最近在一次采访中被问到这个问题 给定一个输入文件、一个正则表达式和一个输出文件。读取输入文件,将每一行与正则表达式匹配,并将匹配的行写入输出文件 我提出了使用链接到文件读取器的BufferedReader(优化磁盘读取)的粗略方案。我在写作中使用了类似的方案 采访者接着说,这个过程需要3秒钟来读取文件中的一行,1秒钟来比较正则表达式和该行,另外5秒钟来写回。所以每行总共需要9秒。我们如何才能改进这一点 我建议一次读取整个文件,处理它,然后一次写入整个输出文件。然而,有人告诉我这没用(写1行=5

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

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

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

采访者接着说,这个过程需要3秒钟来读取文件中的一行,1秒钟来比较正则表达式和该行,另外5秒钟来写回。所以每行总共需要9秒。我们如何才能改进这一点

我建议一次读取整个文件,处理它,然后一次写入整个输出文件。然而,有人告诉我这没用(写1行=5秒,写2行=10秒)

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


我只能想到缓冲读/写,也找不到太多。有什么想法吗

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


这里的假设是,阅读、解析和写作可以彼此独立地进行。在本例中,您可以在写入第1行的同时读取第2行:您只需4秒钟即可读取并应用正则表达式,而在编写器准备好第二行之前,您还有整整5秒钟的时间。写入仍然是您的瓶颈,但整个过程加快了约44%,这还不错。

既然读取时间是固定的,写入时间是固定的,在这种情况下,您唯一的选择就是更改正则表达式位的性质

您可以编写代码来快速应用regex测试,而无需使用regex所能做的所有聪明的事情


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

这是一个棘手的问题,因为我们对系统没有太多了解

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

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

  • R/R表示读数(3秒)
  • P/P表示处理(1秒)
  • W/W表示书写(5秒)
大写字母标记开始,小写字母标记继续工作。A“:”表示线程空闲

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

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

多线程和同步?您不必等待1秒钟进行正则表达式处理,然后继续读取下一行。在regex处理终止后,另一个等待匹配行的线程可以写入输出。但我怀疑这最后一步是否会带来很大的改进,因为你有一张光盘,它在某一特定时刻读或写。