Replace() не выполняется для больших строк

У меня есть следующий код:

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 имеет около 5 * 10 ^ 6 строк, он терпит неудачу при t = replace(t, r"( 1:1\.0+)|(( 1:1\.0+)|(([1-6]:)|((\|user )|(\|))))", "") со следующим сообщением

1 ответ

Этот вопрос старый, и на основе старой версии Джулии. Однако было бы полезно проверить, работает ли это в последней версии. Недавно я проверил это в последней версии версии 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).

licensed under cc by-sa 3.0 with attribution.