Julia 1.1 Как использовать JDL или JDL2 для активной записи индексированных матричных данных в файл на диске?

#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 произошли одновременно на диске.)