【问题标题】:Parallel text processing in juliaJulia 中的并行文本处理
【发布时间】:2014-02-13 14:10:50
【问题描述】:

我正在尝试编写一个简单的函数来读取一系列文件并对它们执行一些正则表达式搜索(或只是一个字数),然后返回匹配的数量,我正在尝试让它运行并行加速它,但到目前为止我一直无法实现这一点。

如果我用数学运算做一个简单的循环,我确实会获得显着的性能提升。但是,grep 函数的类似想法并不能提高速度:

function open_count(file)
    fh = open(file)
    text = readall(fh)
    length(split(text))
end



tic()
total = 0
for name in files
    total += open_count(string(dir,"/",name))
    total
end
toc()
elapsed time: 29.474181026 seconds


tic()
total = 0
total = @parallel (+) for name in files
    open_count(string(dir,"/",name))
end
toc()

elapsed time: 29.086511895 seconds

我尝试了不同的版本,但速度没有显着提高。我做错了吗?

【问题讨论】:

  • 27 秒处理文件?我猜这些是相当大的磁盘文件,它们不适合您的处理器磁盘缓存,并且每次都必须从磁盘中读取。那么你可以期望的最好的时间就是从磁盘读取两个文件的时间。通常,磁盘一次只能读取一个位置 --> 磁盘读取是顺序的,因此没有加速。
  • 这不是一个单独的文件,而是一个文件列表(我认为总共差不多 1 ​​GB)。我应该这么说的。但感谢您的解释。
  • 我无法测试这个,因为我没有这种大小的文件可以测试。你能发布一个脚本来生成具有相同结构和大小的东西吗?您的操作系统可能会占用大部分时间。您是否考虑过关闭 open_count() 中的文件?
  • 你有没有分析过?这样做会告诉您瓶颈是在 I/O 中还是在正则表达式中。如果是前者,请考虑将文件分散到多个驱动器中。
  • @ivarne 关闭文件确实略微提高了性能,这将很有帮助。有了这个script,你可以得到一个相似的语料库。

标签: parallel-processing julia


【解决方案1】:

我在使用 R 和 Python 时遇到过类似的问题。正如其他人在评论中指出的那样,您应该从探查器开始。

如果读取占用了大部分时间,那么您无能为力。您可以尝试将文件移动到不同的硬盘驱动器并从那里读取它们。 您还可以尝试 RAMDisk 类型的解决方案,它基本上使您的 RAM 看起来像永久存储(减少可用 RAM),但随后您可以获得非常快速的读取和写入。

但是,如果时间用于执行正则表达式,请考虑以下事项: 创建一个函数,将一个文件作为一个整体读取并拆分出单独的行。这应该是一个连续读取,因此尽可能快。然后创建一个并行版本的正则表达式,它并行处理每一行。这样,整个文件都在内存中,您的计算核心可以更快地处理数据。这样您可能会看到性能有所提高。

这是我在尝试处理大型文本文件时使用的一种技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多