日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab读int16读文件_MATLAB: 使用内存映射加快文件读写

發布時間:2025/4/5 循环神经网络 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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: 使用内存映射加快文件读写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。