matlab - 加快处理较大的二进制文件

标签 matlab performance file-io 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{:}];

因此,我将 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/

相关文章:

matlab - 试图找到/理解哈里斯角的正确实现

recursion - 如何在 MATLAB 中正确使用递归?

mysql - 从 Azure Mysql 导出数据最有效的方法是什么?

android - 如何列出设备上的所有图像?

matlab - 使用 squareform 的替代方法(Matlab)

java - 如何从 MATLAB 代码捕获 java 异常

Javascript 在没有进一步引用变量后清除变量

sql - Postgresql 顺序扫描在 5 亿行上性能下降

Java 性能 - ArrayLists 与 Arrays 相比,可实现大量快速读取

c++ - Windows 上不可靠的文件系统操作