gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:15:32 24 4
gpt4 key购买 nike

我必须通过成对读取二进制文件并创建位级数据结构(通常是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com