Julia - 使用并行技术读取大文件

3

假设我在 Julia v1.1 中有一个非常大的文本文件(30GB),我想要使用并行处理(多线程)来读取每一行,应该怎么做?

在查看Julia的多线程文档后,这段代码是尝试实现以上功能的,但是它根本不起作用。

open("pathtofile", "r") do file
    # Count number of lines in file
    seekend(file)
    fileSize = position(file)
    seekstart(file)

    # skip nseekchars first characters of file
    seek(file, nseekchars)

    # progress bar, because it's a HUGE file
    p = Progress(fileSize, 1, "Reading file...", 40)
    Threads.@threads for ln in eachline(file)
        # do something on ln
        u, v = map(x->parse(UInt32, x), split(ln))
        .... # other interesting things
        update!(p, position(file))
    end    
end

注意1:您需要使用ProgressMeter(我希望我的代码在并行读取文件时显示进度条)

注意2:nseekchars是一个整数,表示我想要在文件开头跳过的字符数

注意3:该代码可以工作,但是如果没有在for循环旁边使用Threads.@threads宏,则不会进行并行处理


2
读取文件并不占用CPU,因此将其并行化不会导致性能提高。而将其存储在条带磁盘阵列上则会有所改善。 - ՕլՁՅԿ
@ııı 谢谢,我不知道条带磁盘阵列是什么,这就是你所说的吗?https://github.com/JuliaParallel/Blocks.jl 不幸的是,Blocks似乎不适用于julia v1.1。 - JKHA
1
我认为他在谈论RAID 0或类似的内容。 - sascha
@sascha 好的,这对我来说很新鲜,Julia 上有相关的东西吗? - JKHA
1个回答

6

为了获得最大的I/O性能:

  1. 并行化硬件 - 使用磁盘阵列而非单个驱动器。尝试搜索“raid性能”以获取许多优秀的解释(或提出单独的问题)

  2. 使用Julia 内存映射机制

s = open("my_file.txt","r")
using Mmap
a = Mmap.mmap(s)
  1. 一旦获得内存映射,进行并行处理。注意线程之间的false sharing(取决于您的实际情况)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接