Hi,
I'm creating a Julia type that conatins a Mmapped Vector. The intention is
that the binary file behind the Mmap vector is created when the type is
initialised and the file is deleted when the gc knows it's out out of
scope. I'm using a finalizer function to achieve the deletion.
My code is below. The code works during the Julia session (deleting files
when they are out of scope) but files are not being deleted when the Julia
session is closed.
For example,
tmp=MmapVectorInt(50,Int[])
tmp=MmapVectorInt(50,Int[])
tmp1=MmapVectorInt(50,Int[])
tmp2=MmapVectorInt(50,Int[])
tmp2=MmapVectorInt(50,Int[])
gc()
Works fine, deleting the file linked to the first tmp and first tmp2.
However, when I end this Julia session only 2 of the 3 remaining files are
deleted.
There seems to be an inconsistency with how Julia finalizes objects within
a Julia session and at the end of a session. Can someone explain this or
offer an alternative approach?
I'm using the 64 bit Windows version of Julia.
Thanks
Lee
function genbinaryfilename()
sleep(0.001)
return split(string(time()),'.')[2]*".bin"
end
type MmapVectorInt
#vector length
vlen::Int
#storage array
vec::Vector{Int}
#mmap file
mmapfile::ASCIIString
function MmapVectorInt(vlen::Int,vec::Vector{Int})
# Generate MMap file
mmapfile=genbinaryfilename()
s = open(mmapfile, "w+")
tmp=Array(Int,vlen)
write(s,tmp)
close(s)
# Reopen MMap file
s = open(mmapfile, "r+")
vec1 = Mmap.mmap(s, Vector{Int}, (vlen,))
close(s)
#copy contents from function to vector
vec1[1:min(vlen,length(vec))]=deepcopy(vec[1:min(vlen,length(vec))])
#create the instance
x = new(vlen,Int[],mmapfile)
#point the vector to the mmapped vector
x.vec=vec1
#add the finalizer function
finalizer(x,DestroyMmapVectorInt)
#return x
x
end
end
function DestroyMmapVectorInt(x::MmapVectorInt)
#finalize the mmapped vector. (unlinks the file)
finalize(x.vec)
if x.mmapfile!=""
#delete the file
rm(x.mmapfile)
end
end