Checking memory usage by Igor

Hello

We are using Igor for analysis of hyperspectral data, each set being about 300-400 MB in size. After loading many scans, the size of an Igor experiment can easily go up to a few GB, and that can cause problems with the computer sometimes. Is there a command in Igor to check for the current size of Igor experiment, so that our function automatically warns users when it becomes larger than a set limit?

We have a function to 'delete raw data' to lighten the RAM usage after finishing data reduction of each scan, but that has to be done manually (after users decide the data reduction is successful).

Thank you!

Best

Chanan

It would be helpful to know what version of Igor you are using. My guess is Igor Pro 6.xx, 32-bit version. If you were running the 64-bit version of Igor Pro 8, you would probably not need to do any memory checking.

The only reliable way to check this is to try to create a wave of a certain size. For example:

Function CheckMemoryAvailability(numberOfMegabytes) // Returns 0 for success, non-zero for failure
    Variable numberOfMegabytes
   
    Variable numBytes = 1048576*numberOfMegabytes
    Make/B/U/O/N=(numBytes)/FREE temp
    Variable err = GetRTError(1)        // Get error if any, and clear it
    return err
End

 

In Igor 7 and later, the string returned by WaveInfo contains the size of the wave in the SIZEINBYTES keyword. You could walk your data tree to calculate the total amount of data used by waves in your experiment. Or, if the experiment is saved on disk, you could look at the size of the file itself with GetFileFolderInfo. Igor experiments don't compress the data contained in the experiment, so the size of an experiment file should roughly correlate with the amount of memory used when an experiment is loaded.

With SIZEINBYTES keyword, I made a code for folder size calculations.

Function SLP_Util_FolderTotalSizeMBytes(FolderName,Print_Flg)
    //CREATED: 09.02.2021
    //DESCRIPTIONs: Calculate folder size (all waves combined) including wave in subfolders.
    String FolderName //Full path of a folder to check **Without ":" at the end
    Variable Print_Flg //Show size of each subfolders
   
    String List_FoldersInFolder=""
    String CurrentFolder=GetDataFolder(1)
   
    SetDataFolder $(FolderName+":")
    List_FoldersInFolder=StringByKey("FOLDERS",DataFolderDir(1),":")
   
    String SubFolder_FName=""
   
    Variable i=0
    Variable TotalSize=SLP_Util_FolderWaveSizeMBytes(FolderName,0)
    If (Print_Flg)
        Print "Waves in "+FolderName+": "+num2str(TotalSize)+" MBytes" //Show combined size of all waves in the specified folder.
    EndIf
    Variable SubFolderSize=0
   
    For (i=0;i<itemsinlist(List_FoldersInFolder,",");i+=1)
        SubFolder_FName=FolderName+":"+StringFromList(i,List_FoldersInFolder,",")
        //TotalSize+=SLP_Util_FolderWaveSizeMBytes(SubFolder_FName,0) //All waves in this Subfolder
        SubFolderSize=SLP_Util_FolderTotalSizeMBytes(SubFolder_FName,0) //Recursive - look inside the subfolder
        TotalSize+=SubFolderSize
        If (Print_Flg)
            Print SubFolder_FName+": "+num2str(SubFolderSize)+" MBytes"
        EndIf
    EndFor
   
    SetDataFolder $CurrentFolder
    If (Print_Flg)
        Print "Total size = "+num2str(TotalSize)+" MBytes"
    EndIf
    Return TotalSize
End


Function SLP_Util_FolderWaveSizeMBytes(FolderName,Print_Flg)
    //CREATED: 09.02.2021
    //DESCRIPTIONs: Return the total size of all waves in a folder in MBytes (not including waves in subfolders)
    String FolderName //Full path of a folder **Without ":" at the end
    Variable Print_Flg //Flag to print out results
   
    String List_WavesInFolder=""
    String CurrentFolder=GetDataFolder(1)
    setdatafolder $(FolderName+":")
   
    List_WavesInFolder=StringByKey("WAVES",DataFolderDir(2),":")
       
    Variable i=0
    String Name_Wave
    String Info_Wave
    Variable Size_Wave
    Variable Size_Sum=0
   
    For (i=0;i<itemsinlist(List_WavesInFolder,",");i+=1)
        Name_Wave=StringFromList(i,List_WavesInFolder,",")
        Info_Wave=WaveInfo($Name_Wave,0)
        Size_Wave=str2num(StringByKey("SIZEINBYTES",Info_Wave,":"))/10^6 //Size in MBytes
        If (Print_Flg)
            Print Name_Wave+" Size = "+num2str(Size_Wave)+" MBytes"
        EndIF
        Size_Sum+=Size_Wave
    EndFor
    If (Print_Flg)
        Print "Total size = "+num2str(Size_Sum)+" MBytes"
    EndIF
    SetDataFolder $CurrentFolder
    Return Size_SUM
End