#arrays #file #julia
#массивы #файл #julia
Вопрос:
Я использую Julia 1.1, и, к счастью, и JDL, и JDL2, похоже, работали.
Я хочу создать 3d-матрицу для сохранения в файл, проиндексированный в $ (x, y, z) $, что не слишком просто
using JLD
save("File_name","variable_name",variable)
Предположим, я уже сделал это, т.е.
using JLD
save("some_file","Matrix_t", M_T)
где M_T был пустым массивом 3d zero.
Затем я хочу сохранять кадры последовательных данных относительно оси $ z $ (как функция matfile в Matlab), чтобы каждый раз я мог сохранять 2d-массив в индексированное место в M_T в файле «some_file».
Я читал об использовании g_create «group». Однако они использовали name с точкой с запятой, и я сомневаюсь, что это то, чего я хотел.
Не могли бы вы помочь мне активно сохранять последовательные данные в 3d-матрице в файл?
Ответ №1:
Вы можете достичь желаемого с помощью ввода-вывода с отображением памяти, поскольку JLD.jl
поддерживаются массивы с отображением памяти.
Следующий фрагмент создаст трехмерный массив типа Float64
и сохранит его в JLD
файл.
using JLD
A = zeros(100, 100, 100)
save("mmap.jld", "A", A)
Теперь давайте откроем файл в другом сеансе Julia и прочитаем A
как массив, отображенный в памяти. Обратите внимание, что ввод-вывод с отображением в память не загрузит весь массив в память сразу, так что, надеюсь, вам не хватит памяти, даже если массив в файле очень большой.
using JLD
file = jldopen("mmap.jld", "r ", mmaparrays = true) # `r ` important if you want to modify the array
A = read(file, "A")
A
массив, отображенный в памяти. Вы можете использовать его так, как если бы это был обычный 3D Array
. Внесенные изменения A
будут записаны в файл на диске. (Хотя вы можете захотеть использовать using Mmap; Mmap.sync!(A)
после всех изменений, просто чтобы убедиться, что изменения действительно записаны на диск, но я не уверен в этом.)
Теперь мы изменим содержимое
A[:,:,1] .= 100
# close the file
close(file)
Теперь вы можете закрыть этот сеанс и попытаться открыть файл в другом сеансе, чтобы увидеть эффект.
Обратите внимание, что вам необходимо выполнить сборку A
мусора, если вы хотите снова открыть файл jld в том же сеансе (т.Е. A = []; GC.gc()
). В противном случае блокировка файла будет сохранена, поскольку A
файл отображен в память. В этом нет необходимости, если вы уже закрываете сеанс.
Комментарии:
1. Большое спасибо! Я понял. (Просто небольшие заметки для новичков вроде меня. Я попробовал это, используя массив объемом 3,5 ГБ, команда «A = read(file, «A»)» на деле не считывает файл в память, но «переменную» A можно использовать точно так же, как обычную матрицу, и изменения в A произошли одновременно на диске.)