Growing Arrays Using matfile
Function
When writing a large number of large values to a MAT-file, the size of the file increases in a nonincremental way. This method of increase is expected. To minimize the number of times the file must grow and ensure optimal performance though, assign initial values to the array prior to populating it with data.
For example, suppose that you have a writable MatFile
object.
fileName = 'matFileOfDoubles.mat';
matObj = matfile(fileName);
matObj.Properties.Writable = true;
Define parameters of the values to write. In this case, write one million values, fifty thousand at a time. The values should have a mean of 123.4, and a standard deviation of 56.7.
size = 1000000; chunk = 50000; mean = 123.4; std = 56.7;
Assign an initial value of zero to the last element in the array prior to populating it with data.
matObj.data(1,size) = 0;
View the size of the file.
On Windows® systems, use
dir
.system('dir matFileOfDoubles.mat');
On UNIX® systems, use
ls -ls
:system('ls -ls matFileOfDoubles.mat');
In this case, matFileOfDoubles.mat
is less
than 5000 bytes. Assigning an initial value to the last element of
the array does not create a large file. It does, however, prepare
your system for the potentially large size increase of matFileOfDoubles.mat
.
Write data to the array, one chunk at a time.
nout = 0; while(nout < size) fprintf('Writing %d of %d\n',nout,size); chunkSize = min(chunk,size-nout); data = mean + std * randn(1,chunkSize); matObj.data(1,(nout+1):(nout+chunkSize)) = data; nout = nout + chunkSize; end
View the size of the file.
system('dir matFileOfDoubles.mat');
The file size is now larger because the array is populated with data.