سؤال

أفكر في كتابة البيانات إلى ملف. هل لدى أي شخص مثال على كيفية كتابة كمية كبيرة من البيانات إلى ملف؟

يحرر: معظم العناصر في المصفوفة هي الأصفار ، والبعض الآخر uint32. أعتقد أن أبسط save() و load() ستعمل ، كما اقترح jonas.

هل كانت مفيدة؟

المحلول

أعتقد أنه لم ير أحد التعديل عن الأصفار :)

إذا كانت معظمها في الغالب ، فيجب عليك تحويل المصفوفة إلى تمثيلها المتفر ومن بعد احفظها. يمكنك القيام بذلك مع متناثر وظيفة.

شفرة

z = zeros(10000,10000);
z(123,456) = 1;
whos z
z = sparse(z);
whos z

انتاج |

Name          Size                   Bytes  Class     Attributes

  z         10000x10000            800000000  double  

Name          Size               Bytes  Class     Attributes

  z         10000x10000            40016  double    sparse    

لا أعتقد أن التنفيذ المتناثر مصمم للتعامل معه uint32.

نصائح أخرى

إذا كنت مهتمًا بالحفاظ على حجم ملف البيانات صغيرًا قدر الإمكان ، فإليك بعض الاقتراحات:

  • اكتب البيانات إلى ملف ثنائي (أي باستخدام في الكتابة) بدلاً من ملف نصي (أي باستخدام fprintf).
  • إذا كانت بياناتك تحتوي على جميع قيم عدد صحيح ، فقم بتحويلها إلى أو حفظها على أنها أ نوع عدد صحيح موقّع أو غير موقّع بدلا من الافتراضي نوع الدقة المزدوجة يستخدم Matlab.
  • إذا كانت بياناتك تحتوي على قيم نقاط عائمة ، لكنك لا تحتاج إلى نطاق أو دقة الافتراضي نوع الدقة المزدوجة, ، قم بتحويله إلى أو حفظه كملف نوع دقيق واحد.
  • إذا كانت بياناتك متناثرة بما فيه الكفاية (أي يوجد عدد أكبر تجد وظيفة للحصول على مؤشرات الصف والعمود للقيم غير الصفر ، ثم فقط حفظها في ملفك.

فيما يلي بعض الأمثلة لتوضيح:

data = double(rand(16,2^20) <= 0.00001);  %# A large but very sparse matrix

%# Writing the values as type double:
fid = fopen('data_double.dat','w');  %# Open the file
fwrite(fid,size(data),'uint32');     %# Write the matrix size (2 values)
fwrite(fid,data,'double');           %# Write the data as type double
fclose(fid);                         %# Close the file

%# Writing the values as type uint8:
fid = fopen('data_uint8.dat','w');  %# Open the file
fwrite(fid,size(data),'uint32');    %# Write the matrix size (2 values)
fwrite(fid,data,'uint8');           %# Write the data as type uint8
fclose(fid);                        %# Close the file

%# Writing out only the non-zero values:
[rowIndex,columnIndex,values] = find(data);  %# Get the row and column indices
                                             %#   and the non-zero values
fid = fopen('data_sparse.dat','w');  %# Open the file
fwrite(fid,numel(values),'uint32');  %# Write the length of the vectors (1 value)
fwrite(fid,rowIndex,'uint32');       %# Write the row indices
fwrite(fid,columnIndex,'uint32');    %# Write the column indices
fwrite(fid,values,'uint8');          %# Write the non-zero values
fclose(fid);                         %# Close the file

سوف تختلف الملفات التي تم إنشاؤها أعلاه اختلافًا كبيرًا في الحجم. الملف 'data_double.dat' سيكون حوالي 131،073 كيلو بايت ، 'data_uint8.dat' سيكون حوالي 16385 كيلو بايت ، و 'data_sparse.dat' سيكون أقل من 2 كيلو بايت.

لاحظ أنني كتبت أيضًا أحجام Data Vector إلى الملفات بحيث يمكن قراءة البيانات مرة أخرى (باستخدام فريد) وإعادة تشكيلها بشكل صحيح. لاحظ أيضًا أنه إذا لم أقم بتوفير ملف 'double' أو 'uint8' حجة ل في الكتابة, ، سيكون MATLAB ذكيًا بما يكفي لمعرفة أنه لا يحتاج إلى استخدام الدقة المزدوجة الافتراضية وسيستخدم فقط 8 بتات لكتابة قيم البيانات (لأنها كلها 0 و 1).

كيف يتم إنشاء البيانات؟ كيف تحتاج إلى الوصول إلى البيانات؟

إذا قمت بحساب بشكل صحيح ، يكون المتغير أقل من 200 ميجابايت إذا كان كل شيء مضاعفًا. وبالتالي ، يمكنك بسهولة حفظه وتحميله كملف .MAT واحد إذا كنت بحاجة إلى الوصول إليه من MATLAB فقط.

%# create data
data = zeros(16,2^20);

%# save data
save('myFile.mat','data');

%# clear data to test everything works
clear data

%# load data
load('myFile.mat')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top