7. Loading sqw
and dnd
objects to memory
Majority of Horace algorithms accept the name of file containing binary sqw
or dnd
object
as the source of the data for operations. This is necessary as not every sqw
object may fit to memory.
When an object can fit memory it is convenient to place it for speed and convenience operating with it.
Horace provides two methods of placing sqw objects in memory: read
or load
operations and
sqw/dnd
object construction.
load
is standard operation, which allow loading sqw/dnd
objects or arrays of such objects previously
saved from MATLAB to standard MATLAB .mat
file using MATLAB save
operation. The objects operated this way
must fit memory.
read
is standard MATLAB command allowing users loading various data in memory. To allow operations with Horace
.sqw
files without overloading standard read
command, Horace introduces read_horace
family of commands.
7.1. read_horace
Reads sqw
or dnd
data from a file. The object type is determined from
the contents of the file.
output = read_horace(filename);
The returned variable is an sqw
or dnd
object.
7.2. read_sqw
Reads sqw
data from a file.
output = read_sqw(filename);
The returned variable is an sqw
object.
7.3. read_dnd
As read_sqw, but reads dnd
data saved to file. If the file contains a
full sqw dataset, then only the binned data will be read.
output = read_dnd(filename);
The returned variable is an dnd
object.
7.4. Constructing sqw
object from filename
Calling sqw
constructor with the name of binary sqw file is equivalent to invoking read_sqw
function.
output = sqw(sqw_filename);
8. Saving sqw objects from memory and creating filebacked objects
8.1. save
There are two ways of saving sqw
or dnd
objects to files on disk.
First – use MATLAB save
command, which would
save objects from memory into MATLAB .mat
files, and second one – using
Horace overload for save
command in storing objects in sqw
file format.
MATLAB command works the same as for any MATLAB variable:
save('filename','variable1_name','variable2_name',...);
The benefit of this way of storing data is the possibility of storing multiple objects in a single .mat
file.
Note that the method works for objects in memory so if you use it to save filebacked sqw
objects you will probably obtain
unexpected results, as main part of filebacked sqw
object is not loaded in memory.
Warning
Saving filebacked objects using MATLAB ``save`` command is dangerous!
One can say that filebacked objects can be created in two ways. First way – “primary” filebacked objects build over existing sqw files or saved with permanent file name. (see below). These objects are backed by permanent .sqw
files which stay on disk after objects are deleted from MATLAB session. Second way – “secondary” filebacked objects obtained as the result of various operations with filebacked sqw objects, e.g. large cuts which do not fit memory – (see File- and memory-backed cuts for more details about filebacked cuts), the result of unary or binary operations between “primary” filebacked sqw
objects, results of filebacked PageOp
algorithms, etc..
These objects are backed by temporary files with extension .tmp_XXXXXXX
and temporary files get deleted when such objects go out of scope.
MATLAB save
command saves part of filebacked object stored in memory. The operation is saving the reference to the file containing the pixels – the name and path to the file the object is backed by. As temporary sqw
(.tmp_XXXXXXX
)
file backing the object gets deleted, .mat
file for stored “secondary” type of filebacked object will contain incorrect reference to the missing file. .mat
file for the “primary” filebacked object will contain reference to existing .sqw
file, so can be restored back until the referred file exists and is not moved or renamed. Obviously, this way of saving filebacked sqw
objects is also not very reliable.
The only reliable way of saving filebacked sqw
object is to use Horace save
command, which stores sqw
object in binary Horace .sqw
file format.
The command for this is:
save(sqw_object, filename);
This method saves single object into Horace binary file with extension .sqw
, so if you have filebacked sqw
object, the method would correctly
write this object. It will be possible to restore the object later by accessing appropriate .sqw
file. If your filebacked object is backed by temporary file, the object will not be physically saved (long operation) as the major part of this object is already located in file. The file contents will be synchronized with the data in memory and temporary file will be renamed to the name, you have provided as the second input for the save
command.
You, of course, can also use Horace save
command to create Horace binary .sqw
files from sqw/dnd
objects in memory.
See File- and memory-backed cuts to read a bit more about filebacked and memory based cuts and Horace Config for the information on how to set up the size of memory based object.
8.2. Create filebacked objects from data on disk
If your sqw
file is big enough (see mem_chunk_size and fb_scale_factor from “hor_config” class for numerical meaning of “big enough”, the command:
fb_obj = sqw('filename');
will create filebacked object fb_obj
. You can operate with filebacked object exactly as with memory based object, but many operations which involve operations with pixels will be slower. Alternatively, you may create filebacked object regardless of its size using command:
fb_obj = read_sqw('filename','-filebacked');
Note, that this command invoked without -filebacked is equivalent to sqw('filename')
and
mb_obj = read_sqw('filename','-force_pix_location');
will try to load sqw
object in memory regardless of its size on disk, so will fail if the object is to big to fit the memory.
The filebacked objects created this way, unlike filebacked objects created as the result of the operations with filebacked objects or large cut
operations, are backed by permanent files which would not be deleted if the object in memory gets deleted.