对于大字符串,replace()失败

时间:2015-09-08 21:40:28

标签: julia

我有以下代码:

cd(joinpath(homedir(),"Desktop"))

using HDF5
using JLD

# read contents of a file
t = readall("sourceFile")

# remove unnecessary characters
t = replace(t, r"( 1:1\.0+)|(( 1:1\.0+)|(([1-6]:)|((\|user )|(\|))))", "")

# convert string into Float64 array (approximately ~140 columns)
data = readdlm(IOBuffer(t), ' ', char(10))

# save array on the hard drive
save("data.jld", "data", data)

当我使用具有10 ^ 4或更少行数的sourceFile测试时,它工作正常。但是当sourceFile有大约5 * 10 ^ 6行时,它会在t = replace(t, r"( 1:1\.0+)|(( 1:1\.0+)|(([1-6]:)|((\|user )|(\|))))", "")失败并显示以下消息

errormsg

1 个答案:

答案 0 :(得分:2)

这个问题已经陈旧,基于旧版Julia。但是,检查这是否适用于最新版本会很有用。我最近在最新的0.5版本的Julia中对此进行了测试,上面的代码似乎可以正常使用5 * 10 ^ 6行,每行600个字符。整个操作在笔记本电脑上占用大约5G的峰值内存。

julia> t=[randstring(600) for i=1:5*10^6];

julia> writecsv("/Users/aviks/tmp/long.csv", t)

julia> t=readstring("/Users/aviks/tmp/long.csv");

julia> length(t)
3005000000

julia> @time t = replace(t, r"( 1:1\.0+)|(( 1:1\.0+)|(([1-6]:)|((\|user )|(\|))))", "");
  43.599660 seconds (137 allocations: 3.358 GB, 0.85% gc time)

(PS:请注意,readall现已弃用,而不是readstring)。