2015-01-10 21 views
7

Ho i file (> 100) che ogni contengono insiemi di dati registrati come questo:MATLAB: come creare più file di memoria mappati con un semplice "iteratore"?

  • file0: [no. di set di dati nel file, n. dei punti dati per la registrazione1, i dati relativi alla registrazione 1, n. di punti dati per la registrazione2, dati relativi alla registrazione2, ..., n. di punti dati per la registrazioneM, dati relativi alla registrazioneM]
  • file1: [no. di set di dati nel file, ...] (come sopra)

Tutti i dati insieme possono superare i 20 GB, quindi il caricamento di tutti i dati in memoria non è un'opzione. Quindi, vorrei creare file mappati in memoria per ciascuno dei file, ma nascondendo all'utente la complessità dei dati sottostanti, ad esempio, vorrei poter operare sui dati come questo:

for i=1:TotalNumberOfRecordings 
    recording(i) = recording(i) * 10;  % some stupid data operation 
              % or even more advanced better: 
    recording(i).relatedData = 2000; 
end 

Quindi, non importa se recording(i) è in file0, file1, o qualche altro file, e indipendentemente dalla sua posizione all'interno del file, ho una lista che mi permette di accedere ai dati relativi tramite una mappa di memoria.

Quello che ho finora, è una lista di tutti i file all'interno di una directory, la mia idea ora era quella di creare semplicemente una lista come questa:

entry1: [memoryMappedFileHandle, dataRangeOfRecording] 
entry2: [memoryMappedFileHandle, dataRangeOfRecording] 

E poi utilizzare questo elenco per altri file astratte e registrazioni. Ho iniziato con questo codice:

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 

Ma io capisco l'errore:

Memmapfile objects cannot be concatenated

Sono abbastanza nuovo a MATLAB quindi questo è probabilmente una cattiva idea, dopo tutto. Come si fa meglio? È possibile creare una tabella memorymapped che contiene più file?

+0

Se ho capito bene il problema, quello che ti serve è anche una mappa globale del 'tutti i vostri files' (non solo un oggetto memmapfile per ogni file). Penso che una piccola classe che contiene questa mappa globale e restituisca l'insieme di dati richiesti sarebbe la strada da percorrere. Quando vuoi accedere a 'recording (i)', vorrebbe puntare a un singolo punto o ad un array? – Hoki

+0

Questo si riduce alla possibilità di concatenare gli oggetti 'memmapfile'? Hai provato gli array 'cell'? – horchler

risposta

2

Non sono sicuro se il nucleo della domanda riguarda specificamente i file mappati in memoria o se esiste un modo per elaborare senza problemi i dati da più file di grandi dimensioni senza che l'utente debba preoccuparsi dei dettagli di dove i dati sono

Per rispondere alla seconda domanda, MATLAB 2014b ha introdotto un nuovo oggetto datastore progettato per fare praticamente questo. In pratica, crei un oggetto datastore che fa riferimento ai tuoi file e puoi quindi estrarre i dati dallo datastore senza doversi preoccupare del file in cui si trova. datastore è inoltre progettato per funzionare a stretto contatto con la nuova funzionalità mapreduce introdotta al stesso tempo, che consente di parallelizzare facilmente la mappa, ridurre gli schemi di programmazione e persino legare con Hadoop.

Per rispondere alla prima domanda: temo di aver trovato la risposta, ovvero che gli oggetti memmapfile non possono essere concatenati, quindi no, non semplici. Penso che il tuo approccio migliore sarebbe quello di costruire la tua classe, che conterrà più oggetti memmapfile in un array di celle insieme a informazioni su quali dati erano in quale file, insieme ad una sorta di metodo getData che recupera i dati appropriati dall'appropriato file. (Questo sarebbe fondamentalmente come scrivere la tua classe datastore, ma che ha funzionato con file mappati in memoria piuttosto che con file, quindi potresti copiare gran parte dei dettagli di progettazione e/o implementazione dallo stesso datastore).

0

Come ha detto Horchler; si potrebbe mettere gli oggetti memmepfile in un array di celle:

list = cell(1,10); % preallocate cell 
for it = 1:10 
memmapfile_object = memmepfile('/path/to/file'); 
list{it} = memmapfile_object; 
end