加速处理较大的二进制文件

use*_*748 2 performance file-io matlab bit-manipulation binaryfiles

我必须通过读取它们并创建一个位级数据结构(通常是1x134217728数组)来处理数千个二进制文件(每个16MB),以便在位级处理它们.

目前我这样做的方式如下:

conv = @(c) uint8(bitget(c,1:32));
measurement = NaN(1,(sizeOfMeasurements*8))   %(1,134217728)
fid = fopen(fileName, 'rb');
byteContent = fread(fid,'uint32');
fclose(fid);
bitRepresentation1 = arrayfun(conv, byteContent, 'UniformOutput', false);
measurement=[bitRepresentation1{:}];
Run Code Online (Sandbox Code Playgroud)

因此,我取代fopenmemmapfile如下:

m = memmapfile(fileName,'Format',{'uint32', [4194304 1], 'byteContent'});
byteContent = m.data.byteContent;
byteContent = double(byteContent);
Run Code Online (Sandbox Code Playgroud)

我为各个指令打印了时间信息(使用tic/ toc),结果表明瓶颈是:

bitRepresentation1 = arrayfun(conv, byteContent, 'UniformOutput', false);  % see first line of code for conv
Run Code Online (Sandbox Code Playgroud)

是否有更有效的方法转换byteContent为存储每个索引位数的数组(即,这是一个位代表byteContent)?

Rod*_*uis 5

让循环遍历所有数字bitget.你循环比特:

fid = fopen(fileName, 'rb');
bitContent = fread(fid,'*ubit64');
fclose(fid);

conv = @(ii) uint8(bitget(bitContent, ii));
bitRepresentation = arrayfun(conv, 1:64, 'UniformOutput', false);

measurement = [bitRepresentation{:}]';
measurement = measurement(:).';
Run Code Online (Sandbox Code Playgroud)

编辑你也可以尝试直接循环:

fid = fopen(fileName, 'rb');
bitContent = fread(fid,'*ubit64');
fclose(fid);

sz = 64 * size(bitContent,1);    
measurement3 = zeros(1, sz, 'uint8');
weave = 1:64:sz;
for ii = 1:64
    measurement3(weave + ii - 1) = uint8(bitget(bitContent, ii)); end
Run Code Online (Sandbox Code Playgroud)

但是在我的系统上,(令人惊讶地)比arrayfun... 慢......但是,我的MATLAB版本是从石器时代开始,你的里程可能会有所不同.试试看