2015-09-08 15 views
7

Mam następujący kod:replace() nie dla dużych ciągów

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) 

który działa dobrze, gdy ja go przetestować z SourceFile że ma 10^4 lub mniejszą liczbę wierszy. Jednak gdy SourceFile że ma około 5 * 10^6 wierszy nie powiedzie się t = replace(t, r"(1:1\.0+)|((1:1\.0+)|(([1-6]:)|((\|user)|(\|))))", "") z następującym komunikatem

errormsg

+0

Zawsze możesz edytować swoje pytanie. – Jubobs

+4

Czy możesz złożyć zgłoszenie błędu na https://github.com/JuliaLang/julia? – mschauer

+2

Czy możesz spróbować użyć oznaczonej wersji Julia 0.4-rc1 i sprawdzić, czy błąd nadal występuje? Wiem, że biblioteka substytucji regex jest natrafiona na wersję i jakiś kod dookoła niej jest refaktoryzowany. –

Odpowiedz

1

To pytanie jest stary, i opiera się na starszej wersji Julia. Warto jednak sprawdzić, czy działa to w najnowszej wersji. Ostatnio testowałem to w najnowszej wersji Julii 0.5, a powyższy kod wydaje się działać poprawnie z 5 * 10^6 liniami po 600 znaków każdy. Cała operacja zajmuje około 5G pamięci szczytowej na moim laptopie.

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: Pamiętaj, że readall jest teraz zastąpiona readstring).