içinde aşırı büyük ek yük Veriyle dolu büyük bir metin dosyası ayrıştırıyorum ve daha sonra yalnızca parçalarına kolayca yükleyebilmem için * .mat dosyası olarak diske kaydediyorum (daha fazla bilgi için bkz. here). dosyalarda okuma ve veri için here). Bunu yapmak için, her seferinde bir satırda okurum, çizgiyi ayrıştırın ve sonra dosyaya ekleyin. Sorun, dosyanın kendisinde bulunan veriden 3 büyüklük büyüklüğünün olmasıdır. İşte MATLAB .mat dosyasında
benim kod tam olmayan bir versiyonudur: 224515 hatlarının 13813 çözümlenen edildikten sonra çok uzun bir süre ve dosya boyutu çok büyük başlamıştı alarak olmuştu çünkü kod durdudatabase = which('01_hit12.par');
[directory,filename,~] = fileparts(database);
matObj = matfile(fullfile(directory,[filename '.mat']),'Writable',true);
fidr = fopen(database);
hitranTemp = fgetl(fidr);
k = 1;
while ischar(hitranTemp)
if abs(hitranTemp(1)) == 32;
hitranTemp(1) = '0';
end
hitran = textscan(hitranTemp,'%2u%1u%12f%10f%10f%5f%5f%10f%4f%8f%15c%15c%15c%15c%6u%2u%2u%2u%2u%2u%2u%1c%7f%7f','delimiter','','whitespace','');
matObj.moleculeNumber(1,k) = uint8(hitran{1});
matObj.isotopeologueNumber(1,k) = uint8(hitran{2});
matObj.vacuumWavenumber(1,k) = hitran{3};
matObj.lineIntensity(1,k) = hitran{4};
matObj.airWidth(1,k) = single(hitran{6});
matObj.selfWidth(1,k) = single(hitran{7});
matObj.lowStateE(1,k) = single(hitran{8});
matObj.tempDependWidth(1,k) = single(hitran{9});
matObj.pressureShift(1,k) = single(hitran{10});
if rem(k,1e4) == 0;
display(sprintf('line %u (%2.2f)',k,100*k/K));
end
hitranTemp = fgetl(fidr);
k = k + 1;
end
fclose(fidr);
ama son çıktı sadece 10k satırlarını temizlediğimi gösterdi. Ben bellek temizlenir ve ardından koştu:
S = whos('-file','01_hit12.mat');
fileBytes = sum([S.bytes]);
T = dir(which('01_hit12.mat'));
diskBytes = T.bytes;
disp([fileBytes diskBytes diskBytes/fileBytes])
ve çıktı alın:
524894 896189009 1707,37141022759
ekstra 895664115 bayt kaplıyor oluyor? Yardım sayfasının biraz fazladan ek yük olması gerektiğini söylüyorum, ama neredeyse bir Gb betimleyici üstbilgisinin biraz fazla olduğunu hissediyorum!
Yeni bilgiler:
denedim öncesi tahsis belki MATLAB bir matris bir döngüde embiggened zaman yapar aynı şeyi yapıyordu düşünerek ve üzerindeki tüm matris için disk alanı bir parça ayırarak, dosyayı her yazmak, ve bu değil. Benim kısa onay komut döndüren bir dosyada uygun veri tipleri sonuçların sıfırlarla dosyayı Dolum:
8531570 71467 0,00837677004349727
Bu benim için daha mantıklı. Matlab dosyayı nadiren kaydediyor, dolayısıyla disk dosya boyutu bellekte tam matrisin boyutundan çok daha küçük. Bununla birlikte, değerleri gerçek verilerle değiştirmeye başladığında, daha önce olduğu gibi aynı davranışı alıyorum ve dosya boyutu tüm makul sınırların ötesine geçiyor.
Yeni yeni bilgi:
100 satır uzunluğundadır verilerin bir alt kümesi üzerinde bu çalıştı. Diske akış yapmak için, v7.3 formatında olması gerekir, bu yüzden alt kümeyi komutumdan geçirdim, belleğe yükledim ve ardından v7.0 formatı olarak yeniden yükledim.
v7.3:3800 8752 2,30
v7.0:3800 2561 0,67
şaşmamak v7.3 biçimi varsayılan değildir İşte sonuçlarıdır. Bu konuda bir şey bilen var mı? Bu bir hata veya özellik mi?
İşletim sisteminiz diskte ne kadar alanın kullanıldığını söylüyor? – Daniel
857,185Kb (Windows 7 64 bit, MATLAB 2013a 64 bit) – craigim
Elbette benim için bir hata gibi görünüyor, ancak parçalara yazarak etrafta dolaşabilirsiniz. 10.000'lik parçalar için denedim ve dosya makul boyutlarda. – chappjc