MATLAB記憶體對映
如果我們的檔案太大而不能一次性載入進記憶體,我們可以建立一個memmapfile物件,這樣可以將原始資料當做陣列一樣來訪問,並且同樣的透過下標訪問資料。
用MNIST資料()舉個例子:
[Xtrain, ytrain, Xtest, ytest] = setupMnist('keepSparse', false);
whos('Xtrain', 'ytrain', 'Xtest', 'ytest');
結果:
Name Size Bytes Class Attributes
Xtest 10000x784 62720000 double
Xtrain 60000x784 376320000 double
ytest 10000x1 80000 double
ytrain 60000x1 480000 double
下面呢,我們把資料儲存型別修改為int16和int8,因為double資料型別訪問速度要比int型別的慢,而且需要記憶體更多。。
fname = fullfile(tempdir(), 'mnist.dat');
fid = fopen(fname, 'w');
fwrite(fid, Xtrain, 'int16');
fwrite(fid, ytrain, 'int8');
fwrite(fid, Xtest, 'int16'); % max int16 value is 32767
fwrite(fid, ytest, 'int8'); % max int8 value is 127
fclose(fid);
好,現在我們在臨時資料夾中建立了一個mnist.dat檔案。
mmap = memmapfile(fname, 'Writable', true, 'Format', ...
{'int16', size(Xtrain), 'Xtrain';
'int8', size(ytrain), 'ytrain';
'int16', size(Xtest), 'Xtest';
'int8', size(ytest), 'ytest';
});
建立一個memmapfile檔案,memmapfile函式的使用:
現在我們可以訪問這個資料了:
tic
X4000 = mmap.Data.Xtrain(4000, :); % 1x784
y4000 = mmap.Data.ytrain(4000);
toc
我們發現需要的時間為
Elapsed time is 0.315341 seconds.
但是一旦把這塊資料載入到記憶體了,再訪問一次
發現時間變為
Elapsed time is 0.004710 seconds.
好了,現在我們可以像一般資料一樣來操作這個資料;
例如賦值:
mmap.Data.Xtrain(1, 30:35) = 255;
求均值:
xbar = mean(mmap.Data.Xtest, 2);
最後別忘記clear該塊資料
clear mmap
delete(fname);
MATLAB記憶體對映
如果我們的檔案太大而不能一次性載入進記憶體,我們可以建立一個memmapfile物件,這樣可以將原始資料當做陣列一樣來訪問,並且同樣的透過下標訪問資料。
用MNIST資料()舉個例子:
[Xtrain, ytrain, Xtest, ytest] = setupMnist('keepSparse', false);
whos('Xtrain', 'ytrain', 'Xtest', 'ytest');
結果:
Name Size Bytes Class Attributes
Xtest 10000x784 62720000 double
Xtrain 60000x784 376320000 double
ytest 10000x1 80000 double
ytrain 60000x1 480000 double
下面呢,我們把資料儲存型別修改為int16和int8,因為double資料型別訪問速度要比int型別的慢,而且需要記憶體更多。。
fname = fullfile(tempdir(), 'mnist.dat');
fid = fopen(fname, 'w');
fwrite(fid, Xtrain, 'int16');
fwrite(fid, ytrain, 'int8');
fwrite(fid, Xtest, 'int16'); % max int16 value is 32767
fwrite(fid, ytest, 'int8'); % max int8 value is 127
fclose(fid);
好,現在我們在臨時資料夾中建立了一個mnist.dat檔案。
mmap = memmapfile(fname, 'Writable', true, 'Format', ...
{'int16', size(Xtrain), 'Xtrain';
'int8', size(ytrain), 'ytrain';
'int16', size(Xtest), 'Xtest';
'int8', size(ytest), 'ytest';
});
建立一個memmapfile檔案,memmapfile函式的使用:
現在我們可以訪問這個資料了:
tic
X4000 = mmap.Data.Xtrain(4000, :); % 1x784
y4000 = mmap.Data.ytrain(4000);
toc
我們發現需要的時間為
Elapsed time is 0.315341 seconds.
但是一旦把這塊資料載入到記憶體了,再訪問一次
發現時間變為
Elapsed time is 0.004710 seconds.
好了,現在我們可以像一般資料一樣來操作這個資料;
例如賦值:
mmap.Data.Xtrain(1, 30:35) = 255;
求均值:
xbar = mean(mmap.Data.Xtest, 2);
最後別忘記clear該塊資料
clear mmap
delete(fname);