Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 将'BufferedReader'转换为'Stream<;字符串>;`平行地_Java_Java 8_Bufferedreader_Java Stream - Fatal编程技术网

Java 将'BufferedReader'转换为'Stream<;字符串>;`平行地

Java 将'BufferedReader'转换为'Stream<;字符串>;`平行地,java,java-8,bufferedreader,java-stream,Java,Java 8,Bufferedreader,Java Stream,有没有一种方法可以从缓冲读取器接收流流,这样流中的每个字符串代表一行读取器,附加条件是直接提供流(在读取器读取所有内容之前)?我想处理流的数据,与从读卡器获取数据并行,以节省时间 编辑:我想在读取数据的同时处理数据。我不想平行处理不同的线。它们应该按顺序处理 让我们举个例子来说明如何节省时间。假设我们的reader将向我们展示100行。读取一行需要2毫秒,处理一行需要1毫秒。如果我先读取所有行,然后处理它们,将需要300毫秒。我要做的是:一旦读取了一行,我就要处理它并并行读取下一行。然后,总时间

有没有一种方法可以从
缓冲读取器
接收
流流
,这样
中的每个字符串代表一行
读取器
,附加条件是直接提供
(在
读取器
读取所有内容之前)?我想处理
的数据,与从
读卡器
获取数据并行,以节省时间

编辑:我想在读取数据的同时处理数据。我不想平行处理不同的线。它们应该按顺序处理

让我们举个例子来说明如何节省时间。假设我们的
reader
将向我们展示100行。读取一行需要2毫秒,处理一行需要1毫秒。如果我先读取所有行,然后处理它们,将需要300毫秒。我要做的是:一旦读取了一行,我就要处理它并并行读取下一行。然后,总时间将为201毫秒


我不喜欢的是
BufferedReader.lines()
:据我所知,当我想处理这些行时,阅读就开始了。假设我已经有了
读卡器
,但必须在处理第一行之前进行预计算。假设它们花费30毫秒。在上面的示例中,使用
reader.lines()
,总时间将是231毫秒或301毫秒(您能告诉我哪些时间是正确的吗?)。但是,由于预计算可以与读取前15行并行进行,因此可以在201毫秒内完成工作。

您可以使用
reader.lines().parallel()
。这样,您的输入将被分割成块,进一步的流操作将在块上并行执行。如果进一步的操作需要大量时间,那么您可能会获得性能改进


在您的情况下,默认的启发式将不会像您所希望的那样工作,我想没有现成的解决方案允许您使用单行批处理。您可以编写一个自定义拆分器,它将在每行之后拆分。查看
java.util.Spliterators.AbstractSpliterator
实现。可能最简单的解决方案是编写类似的代码,但将批处理大小限制为
trySplit
中的一个元素,并在
tryAdvance
方法中读取单行。

要执行所需操作,通常需要一个线程读取行并将其添加到阻塞队列中,第二个线程将从这个阻塞队列中获取行并处理它们。

您看到的位置不对。您认为行流将从文件中读取行,但它不是这样工作的。您不能告诉底层系统读取一行,因为在读取之前没有人知道一行是什么

BufferedReader
因其字符缓冲区而具有名称。此缓冲区的默认容量为8192。每当请求新行时,缓冲区将被解析为新行序列,并返回该部分。当缓冲区中没有足够的字符来查找当前行时,整个缓冲区将被填满

现在,填充缓冲区可能会导致请求从底层
InputStream
读取字节,以填充字符解码器的缓冲区。请求的字节数和实际读取的字节数取决于字符解码器的缓冲区大小、实际编码映射到一个字符的字节数以及底层
InputStream
是否有自己的缓冲区以及缓冲区的大小

实际昂贵的操作是从底层流读取字节,从行读取请求到这些读取操作之间没有简单的映射。请求第一行可能会导致读取,比如说从底层文件读取一个16kib的块,随后的一百个请求可能会从已填充的缓冲区中得到服务,并且根本不会导致I/O。您对
流所做的任何操作都不能改变这一点。唯一可以并行化的是在缓冲区中搜索新行字符,这太微不足道了,无法从并行执行中获益


但是,您可以减少所有相关方的缓冲区大小,以便在处理前一行时大致获得一行的预期并行读取,这种并行执行将永远无法补偿缓冲区大小过小导致的性能下降。

我希望使用流概念,我不必再编写此类线程内容。Marko Topolnik编写了一个拆分器包装器,允许您更改批处理大小: