MATLAB:如何使用简单的"迭代器"创建多个映射的内存文件?

use*_*372 7 file-io matlab memory-mapped-files

我有文件(> 100),每个文件包含记录的数据集,如下所示:

  • file0:[没有.文件中的数据集,没有.记录1的数据点,记录1的相关数据,没有.记录2的数据点,记录2的相关数据,...,没有.记录M的数据点,记录M的相关数据
  • file1:[没有.文件中的数据集,...](与上面相同)

所有数据一起可能超过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很陌生,所以这毕竟不是一个坏主意.怎么做得更好?是否可以创建包含多个文件的内存映射表?

Sam*_*rts 2

我不确定您问题的核心是否专门与内存映射文件有关,或者是否有一种方法可以无缝处理多个大文件中的数据,而无需用户担心数据所在位置的详细信息。

为了解决第二个问题,MATLAB 2014b 引入了一个新datastore对象,其设计目的几乎就是为了解决这个问题。本质上,您创建一个datastore引用您的文件的对象,然后您可以从中提取数据,而datastore无需担心它位于哪个文件中。它还被设计为与同时引入的datastore新功能紧密配合,这mapreduce允许您轻松并行化映射缩减编程模式,甚至与 Hadoop 结合使用。

回答第一个问题 - 恐怕我想你已经找到了答案,那就是memmapfile对象不能连接,所以不,不简单。我认为最好的方法是构建自己的类,该类在元胞数组中包含多个memmapfile对象,以及有关哪个数据位于哪个文件中的信息,以及某种从getData适当的文件中检索适当数据的方法。(这基本上就像编写自己的datastore类一样,但它使用内存映射文件而不是文件,因此您可能能够从其datastore自身复制大部分设计和/或实现细节)。