matlab读int16读文件_MATLAB: 使用内存映射加快文件读写
內存映射是將磁盤上某文件的一部分或整個文件映射到應用程序地址空間內某個地址范圍的一種機制。然后,應用程序可采用與訪問動態內存相同的方法訪問磁盤上的文件。與使用fread和fwrite等函數相比,能夠加快文件的讀取和寫入速度。
實際上,就是將文件在磁盤上的地址映射為虛擬內存。
1.讀寫二進制文件
將int16二進制文件映射到內存中,跳過前1000個字節。注意是字節,不是數的個數。對于int16類型來說,相當于跳過前500個數。
m = memmapfile('E:\BDSdata\IF_0115_20M.bin','Format','int16','offset',1000)
可以看到,m是一種memmapfile數據類型。(本質上就是個結構體)
此時,文件已經被映射到虛擬內存上,可以利用m.Data進行讀取。
如果想要進行數據寫入的話,需要將Writable值設為true,然后直接修改m.Data值,即可完成對磁盤上文件的修改。
m.Writable = true;
m.Data(1e8+2) = 0; % 將第1e8+2個數從-261修改為0
m.Data(1e8:1e8+5)
2.讀寫文本文件
%% TODO
3.讀寫性能實戰
在之前一篇關于并行連續濾波的文章中,其中的一個重要的限制就是,文件的讀取與寫入不能并行,導致性能提升有限。易夕:MATLB并行計算之多進程連續濾波?zhuanlan.zhihu.com
這里采用內存映射的讀取方式,從而實現了多進程讀寫。濾波器函數lowpassFilter與多進程濾波函數multiProcessFilter都是上文中已經出現的函數。
functionmain()objFilter = lowpassFilter;
% parpool(6)
tic;multiProcessFilter(objFilter,'raw.bin','multi.bin',6);toc
% 時間已過 44.099015 秒。
tic;memMapMultiFilter(objFilter,'raw.bin','memMap.bin',6);toc
% 時間已過 31.000704 秒。
visdiff('multi.bin','memMap.bin','binary');
% 這些文件相同
end
functionmemMapMultiFilter(objFilter,rawFile,processFile,M)% 復制一份原文件,在新文件的基礎上寫入得到濾波后的文件
copyfile(rawFile,processFile,'f');
% 將原文件映射到虛擬內存
raw = memmapfile(rawFile,'Format','int8');
% 將新文件映射到虛擬內存
filtered = memmapfile(processFile,'Format','int8','Writable',true);
overlap = length(objFilter.States);
len = length(raw.Data);
workload = 2e7;
numOfWork = round(len/M/workload);
idx = round(linspace(1,len,numOfWork*M+1));
idx_lap = idx + overlap;
idx_lap(end) = len;
spmd(M)
for ii = 1:numOfWork
jj = (labindex-1)*numOfWork + ii;
if jj == 1
fdata = filter(objFilter,raw.Data(1:idx_lap(2)));
filtered.Data(1:idx_lap(2)) = int8(fdata);
else
fdata = filter(objFilter,raw.Data(idx(jj):idx_lap(jj+1)));
filtered.Data(idx_lap(jj):idx_lap(jj+1)) = int8(fdata(overlap+1:end));
end
end
end
end
可以看到,使用68階FIR濾波器對1.2G的int8文件進行濾波,使用fread/fwrite函數進行讀寫,6進程濾波需要約44秒。而使用內存映射memmapfile函數,6進程濾波僅需31秒,速度提高了大約30%。
總結使用內存映射比標準I/O函數擁有更快的訪問速度,使用操作系統虛擬內存功能讀取和寫入數據,而不必分配數據緩沖區。
利用內存映射,可以像訪問數組一樣訪問文件,直接使用MATLAB的索引操作,更加簡潔。
利用內存映射,可以在不同的函數之間共享數據。(類似于共享內存)
內存映射的釋放是一個坑點。官方文檔上面聲稱,退出創建內存映射的函數時,會自動清除掉內存映射,實測某些情況下不會,可能導致無法對文件進行操作,此時只能重啟MATLAB。為了避免這點,建議在函數結尾用clear命令清除內存映射。易夕:MATLAB Tricks 專欄目錄?zhuanlan.zhihu.com
總結
以上是生活随笔為你收集整理的matlab读int16读文件_MATLAB: 使用内存映射加快文件读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 数组遍历符合条件跳出循环体_Jav
- 下一篇: 计算特征数据matlab代码,科学网—M