【发布时间】:2017-03-19 20:09:32
【问题描述】:
Julia 文档描述了 pre-allocating memory 的 Array 以通过避免垃圾收集来提高性能。毕竟,这可能与作为向量的String 有关吗? String源代码为here。
我的用例是我正在处理大型文本转储,使用readuntil() 获取一个块,然后执行正则表达式match() 或matchall() 或replace()。我已经用 Perl 编写了代码,但想看看 Julia 是否可以更快。我已经知道我必须处理的最长字符串的长度。
fs=open(fn,"r")
while !eof(fs)
text = readuntil(fs, "</tag>")
text = match(r"pattern"s, text).match
text = replace(text, r"badpattern", "goodpattern")
text = replace(text, r"anotherbadpattern", "betterpattern")
... (dozens more replacements)
end
close(fs)
我预计磁盘 I/O 将成为主要瓶颈,但我有兴趣了解任何有用的东西。我欢迎任何关于加快进程的可能方法的建议。
【问题讨论】:
-
您链接到的源代码是
String的构造函数,它以Vector作为输入,但它不是类型定义本身(正如@slowbrain 指出的那样,它是不可变)。 -
你能添加更具体的代码示例吗?
-
@DanGetz 添加了代码示例。我希望不必(重新)分配
text字符串数百万次,因为有很多循环来收集ed 文本和许多替换。我希望使用 Julia 的正则表达式功能,因为我已经在 Perl 中对此进行了编码,但正如 @ColinTBowers 和 @slowbrain 所指出的,String 是不可变的,因此无法重新分配。 -
你能给我们比较 Perl 和 Julia 版本的时间吗?我的答案中的代码将
replace的分配减少了 50%。原来text不是唯一分配的东西。你知道 Perl 是否进行分配吗?
标签: arrays string performance memory-management julia