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)
因此,我取代fopen与memmapfile如下:
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)?
让循环遍历所有数字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版本是从石器时代开始,你的里程可能会有所不同.试试看