Memory-mapped I/O
وحدة منخفضة المستوى لـ mmap (تعيين الذاكرة للملفات).
Mmap.Anonymous
— TypeMmap.Anonymous(name::AbstractString="", readonly::Bool=false, create::Bool=true)
إنشاء كائن يشبه IO
لإنشاء ذاكرة mmap مُعَدَّة بالصفر وغير مرتبطة بملف للاستخدام في mmap
. يُستخدم بواسطة SharedArray
لإنشاء مصفوفات ذاكرة مشتركة.
أمثلة
julia> using Mmap
julia> anon = Mmap.Anonymous();
julia> isreadable(anon)
true
julia> iswritable(anon)
true
julia> isopen(anon)
true
Mmap.mmap
— Functionmmap(io::Union{IOStream,AbstractString,Mmap.AnonymousMmap}[, type::Type{Array{T,N}}, dims, offset]; grow::Bool=true, shared::Bool=true)
mmap(type::Type{Array{T,N}}, dims)
أنشئ Array
ترتبط قيمه بملف، باستخدام الذاكرة المخصصة. يوفر هذا طريقة ملائمة للعمل مع البيانات التي تكون أكبر من أن تتناسب مع ذاكرة الكمبيوتر.
النوع هو Array{T,N}
مع عنصر من نوع bits-type T
وأبعاد N
التي تحدد كيفية تفسير بايتات المصفوفة. لاحظ أن الملف يجب أن يكون مخزناً بتنسيق ثنائي، ولا يمكن إجراء تحويلات تنسيقية (هذه هي قيود أنظمة التشغيل، وليس جوليا).
dims
هو مجموعة أو عدد صحيح واحد Integer
يحدد حجم أو طول المصفوفة.
يتم تمرير الملف عبر وسيط الدفق، إما كـ IOStream
مفتوح أو سلسلة اسم الملف. عند تهيئة الدفق، استخدم "r"
لمصفوفة "للقراءة فقط"، و "w+"
لإنشاء مصفوفة جديدة تستخدم لكتابة القيم إلى القرص.
إذا لم يتم تحديد وسيط type
، فإن القيمة الافتراضية هي Vector{UInt8}
.
اختياريًا، يمكنك تحديد إزاحة (بالبايت) إذا، على سبيل المثال، كنت ترغب في تخطي رأس في الملف. القيمة الافتراضية للإزاحة هي موضع الدفق الحالي لـ IOStream
.
تحدد وسيطة الكلمة grow
ما إذا كان يجب توسيع ملف القرص لاستيعاب الحجم المطلوب من المصفوفة (إذا كان الحجم الإجمالي للملف < الحجم المطلوب للمصفوفة). تتطلب صلاحيات الكتابة لتوسيع الملف.
تحدد وسيطة الكلمة shared
ما إذا كانت Array
الناتجة والتغييرات التي تم إجراؤها عليها ستكون مرئية لعمليات أخرى تقوم بربط نفس الملف.
على سبيل المثال، الكود التالي
# إنشاء ملف للذاكرة المخصصة
# (يمكنك أيضًا استخدام mmap للقيام بهذه الخطوة)
using Mmap
A = rand(1:20, 5, 30)
s = open("/tmp/mmap.bin", "w+")
# سنكتب أبعاد المصفوفة كأول عددين صحيحين في الملف
write(s, size(A,1))
write(s, size(A,2))
# الآن اكتب البيانات
write(s, A)
close(s)
# اختبار عن طريق قراءته مرة أخرى
s = open("/tmp/mmap.bin") # الافتراضي هو للقراءة فقط
m = read(s, Int)
n = read(s, Int)
A2 = mmap(s, Matrix{Int}, (m,n))
ينشئ مصفوفة Matrix{Int}
بحجم m
في n
، مرتبطة بالملف المرتبط بالدفق s
.
سيحتاج ملف أكثر قابلية للنقل إلى ترميز حجم الكلمة – 32 بت أو 64 بت – ومعلومات ترتيب البايت في الرأس. في الممارسة العملية، ضع في اعتبارك ترميز البيانات الثنائية باستخدام تنسيقات قياسية مثل HDF5 (التي يمكن استخدامها مع الذاكرة المخصصة). ```
mmap(io, BitArray, [dims, offset])
أنشئ BitArray
ترتبط قيمه بملف، باستخدام الذاكرة المخصصة؛ له نفس الغرض، ويعمل بنفس الطريقة، وله نفس الوسائط، مثل mmap
، لكن تمثيل البايت مختلف.
أمثلة
julia> using Mmap
julia> io = open("mmap.bin", "w+");
julia> B = mmap(io, BitArray, (25,30000));
julia> B[3, 4000] = true;
julia> Mmap.sync!(B);
julia> close(io);
julia> io = open("mmap.bin", "r+");
julia> C = mmap(io, BitArray, (25,30000));
julia> C[3, 4000]
true
julia> C[2, 4000]
false
julia> close(io)
julia> rm("mmap.bin")
هذا ينشئ BitArray
بحجم 25 في 30000، مرتبط بالملف المرتبط بالتدفق io
.
Mmap.sync!
— FunctionMmap.sync!(array)
يُجبر على التزامن بين النسخة الموجودة في الذاكرة من Array
أو BitArray
المخصصة للذاكرة والنسخة الموجودة على القرص.