相关疑难解决方法(0)

当高吞吐量(3GB/s)文件系统可用时,如何在 Java 中使用多线程读取文件

我知道对于普通的主轴驱动系统,使用多线程读取文件效率低下。

这是一个不同的情况,我有一个高吞吐量的文件系统可供我使用,它提供高达 3GB/s 的读取速度,具有 196 个 CPU 内核和 2TB RAM

单线程 Java 程序以最大 85-100 MB/s 的速度读取文件,因此我有可能比单线程更好。我必须读取大小为 1TB 的文件,并且我有足够的 RAM 来加载它。

目前我使用以下或类似的东西,但需要用多线程编写一些东西以获得更好的吞吐量:

Java 7 文件:50 MB/s

List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Run Code Online (Sandbox Code Playgroud)

Java commons-io:48 MB/s

List<String> lines = FileUtils.readLines(new File("/path/to/file.txt"), "utf-8");
Run Code Online (Sandbox Code Playgroud)

与番石榴相同:45 MB/s

List<String> lines = Files.readLines(new File("/path/to/file.txt"), Charset.forName("utf-8"));
Run Code Online (Sandbox Code Playgroud)

Java 扫描程序类:非常慢

Scanner s = new Scanner(new File("filepath"));
ArrayList<String> list = new ArrayList<String>();
while (s.hasNext()){
    list.add(s.next());
}
s.close();
Run Code Online (Sandbox Code Playgroud)

我希望能够以正确的排序顺序加载文件并尽可能快地构建相同的 ArrayList。

还有另一个问题读起来相似,但实际上不同,因为:问题是讨论多线程文件 I/O 在物理上不可能高效的系统,但由于技术进步,我们现在拥有的系统是旨在支持高吞吐量 I/O ,因此限制因素是 CPU/SW ,这可以通过 I/O 多线程来克服。

另一个问题没有回答如何为多线程 I/O …

java io file-io multithreading

4
推荐指数
1
解决办法
6981
查看次数

从文件中读取异步I/O.

我最近得到了多个项目的想法,都涉及从文件中读取IP地址.由于它们都应该能够处理大量主机,因此我尝试实现多线程或创建套接字池并从中选择() - 以实现某种形式的并发以获得更好的性能.在多个场合,从文件中读取似乎是提高性能的瓶颈.我理解它的方式,从具有fgets或类似的文件读取是一个同步,阻塞操作.因此,即使我成功实现了异步连接到多个主机的客户端,操作仍然是同步的,因为我一次只能从文件中读取一个地址.

    /* partially pseudo code */

/* getaddrinfo() stuff here */

while(fgets(ip, sizeof(ip), file) {
FD_ZERO(&readfds);
/* create n sockets here in a for loop */
for (i = 0; i < socket_num; i++) {
    if (newfd > fd[i]) newfd = fd[i];
    FD_SET(fd[i], &readfds);
}

/* here's where I think I should connect n sockets to n addresses from file
 * but I'm only getting one IP at a time from file, so I'm not sure how to …
Run Code Online (Sandbox Code Playgroud)

c multithreading pthreads

3
推荐指数
1
解决办法
502
查看次数

标签 统计

multithreading ×2

c ×1

file-io ×1

io ×1

java ×1

pthreads ×1