首頁>Club>
4
回覆列表
  • 1 # 飯拍收集君

    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);

  • 中秋節和大豐收的關聯?
  • 讚美男人年輕句子?