我必须通过成对读取二进制文件并创建位级数据结构(通常是 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{:}];
因此,我将 fopen
替换为 memmapfile
,如下所示:
m = memmapfile(fileName,'Format',{'uint32', [4194304 1], 'byteContent'});
byteContent = m.data.byteContent;
byteContent = double(byteContent);
我为各个指令打印了计时信息(使用tic
/toc
),结果发现瓶颈是:
bitRepresentation1 = arrayfun(conv, byteContent, 'UniformOutput', false); % see first line of code for conv
是否有更有效的方法将 byteContent
转换为每个索引存储一个位的数组(即 byteContent
的位表示)?
最佳答案
让 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(:).';
编辑您也可以尝试直接循环:
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
但在我的系统上,它(令人惊讶地)比 arrayfun
慢...但是,我的 MATLAB 版本来自石器时代,您的里程可能会有所不同。试一试
关于matlab - 加快处理较大的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40863898/