use*_*372 7 file-io matlab memory-mapped-files
我有文件(> 100),每个文件包含记录的数据集,如下所示:
所有数据一起可能超过20 GB,因此无法将所有数据加载到内存中.因此,我想为每个文件创建内存映射文件但是从"用户"隐藏底层数据的复杂性,例如,我希望能够对这样的数据进行操作:
for i=1:TotalNumberOfRecordings
recording(i) = recording(i) * 10; % some stupid data operation
% or even more advanced better:
recording(i).relatedData = 2000;
end
Run Code Online (Sandbox Code Playgroud)
因此,无论recording(i)是在file0,file1还是其他文件中,无论它在文件中的位置,我都有一个允许我通过内存映射访问相关数据的列表.
到目前为止,我是一个特定目录中的所有文件的列表,我现在的想法是简单地创建一个这样的列表:
entry1: [memoryMappedFileHandle, dataRangeOfRecording]
entry2: [memoryMappedFileHandle, dataRangeOfRecording]
Run Code Online (Sandbox Code Playgroud)
然后使用此列表进一步抽象文件和录音.我从这段代码开始:
fileList = getAllFiles(directoryName);
list = []; n = 0;
for file = 1:length(fileList);
m = memmapfile(fileList(file));
for numberOfTracesInFile
n = n+1;
list = [list; [n, m]];
end
end
Run Code Online (Sandbox Code Playgroud)
但我确实得到了错误:
Memmapfile objects cannot be concatenated
我对MATLAB很陌生,所以这毕竟不是一个坏主意.怎么做得更好?是否可以创建包含多个文件的内存映射表?
我不确定您问题的核心是否专门与内存映射文件有关,或者是否有一种方法可以无缝处理多个大文件中的数据,而无需用户担心数据所在位置的详细信息。
为了解决第二个问题,MATLAB 2014b 引入了一个新datastore对象,其设计目的几乎就是为了解决这个问题。本质上,您创建一个datastore引用您的文件的对象,然后您可以从中提取数据,而datastore无需担心它位于哪个文件中。它还被设计为与同时引入的datastore新功能紧密配合,这mapreduce允许您轻松并行化映射缩减编程模式,甚至与 Hadoop 结合使用。
回答第一个问题 - 恐怕我想你已经找到了答案,那就是memmapfile对象不能连接,所以不,不简单。我认为最好的方法是构建自己的类,该类在元胞数组中包含多个memmapfile对象,以及有关哪个数据位于哪个文件中的信息,以及某种从getData适当的文件中检索适当数据的方法。(这基本上就像编写自己的datastore类一样,但它使用内存映射文件而不是文件,因此您可能能够从其datastore自身复制大部分设计和/或实现细节)。