gpt4 book ai didi

java - 处理一个巨大的文件并在文件的每一行快速调用一个函数

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:21 25 4
gpt4 key购买 nike

我有一个包含大约 10.000.000 行文本的文件(是的,我有足够的内存)。现在我想要一个 MyClass 的列表(构造函数是 MyClass(String s) 与文件的每一行。现在我是这样做的:

List<MyClass> help = Files.lines(Paths.get(s))
.parallel()
.map(MyClass::new)
.collect(Collectors.toList());

但它需要数年才能进步。关于如何加快这个问题的任何想法?

最佳答案

首先,来自 Collectors.toList() 文档的相关摘录:

[...]There are no guarantees on the type, mutability, serializability, or thread-safety of the List returned; if more control over the returned List is required, use toCollection(Supplier)

现在,让我们更深入地了解一下 Collection 家的 characteristics ;我们发现:

public static final Collector.Characteristics CONCURRENT

Indicates that this collector is concurrent, meaning that the result container can support the accumulator function being called concurrently with the same result container from multiple threads.

If a CONCURRENT collector is not also UNORDERED, then it should only be evaluated concurrently if applied to an unordered data source.

现在,没有任何东西可以保证 Collectors.toList() 返回的收集器是 Concurrent

尽管启动您的新类可能需要时间,但这里安全的赌注是假设此收集器不是并发的。但幸运的是,我们有办法使用并发集合,如 javadoc 中所述。那么,让我们试试:

.collect(
Collector.of(CopyOnWriteArrayList::new,
List::add,
(o, o2) -> { o.addAll(o2); return o; },
Function.<List<String>>identity(),
Collector.Characteristics.CONCURRENT,
Collector.Characteristics.IDENTITY_FINISH
)
)

这可能会加快速度。

现在,你有另一个问题。你不会关闭你的流。

这是鲜为人知的,但是 Stream(无论是任何类型还是 {Int,Double,Long}Stream)都实现了 AutoCloseable。您想要关闭受 I/O 限制的流,Files.lines() 就是这样一个流。

那么,试试这个:

final List<MyClass> list;

try (
final Stream<String> lines = Files.lines(...);
) {
list = lines.parallel().map(MyClass::new)
.collect(seeAbove);
}

关于java - 处理一个巨大的文件并在文件的每一行快速调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com