
df-like Utility to Estimate Data Folder Size

kravlor
An optional summary of the traversed data folder tree with it's estimated size in MB can be printed to the history by passing the optional depth parameter.
If one does not care about error in estimating size of complex variables, dfSize can easily be made ThreadSafe, as indicated.
// dfSize: Given a data folder reference, estimates the size, in bytes, of its contents. // This will be an underestimate, as it does not properly treat special waves such as DFREFs, etc. // Wave sizes are estimated with wSize, and are subject to its limitations. // If the optional depth parameter is specified with a positive integer, prints directory status updates // up to depth from dfr with size in MB. Function dfSize(dfr, [depth, curDepth]) DFREF dfr Variable depth // print depth size updates Variable curDepth // current depth if(ParamIsDefault(depth)) depth = NaN endif if(ParamIsDefault(curDepth)) curDepth = 0 endif DFREF dfSave = GetDataFolderDFR() SetDataFolder dfr Variable i Variable byteSum = 0 String curName = "" Variable numDFs = CountObjectsDFR(dfr, 4) for(i = 0; i < numDFs; i += 1) curName = GetIndexedObjNameDFR(dfr, 4, i) DFREF curDF = $curName byteSum += dfSize(curDF, depth = depth, curDepth = curDepth + 1) endfor // Children are handled; do sum Variable nvarSiz = 0 Variable wavSiz = 0 Variable svarSiz = 0 for(i = 0; i < CountObjectsDFR(dfr, 3); i += 1) curName = GetIndexedObjNameDFR(dfr, 3, i) SVAR curSVAR = $curName svarSiz += strlen(curSVAR) endfor // NVARS are always floating point, but might be complex nvarSiz += 4 * ItemsInList(VariableList("*", ";", 4)) + 8 * ItemsInList(VariableList("*", ";", 5)) // This would need to be enabled for a ThreadSafe implementation, should a means to test NVARs for complex-ness be found // for(i = 0; i < CountObjectsDFR(dfr, 2); i += 1) // curName = GetIndexedObjNameDFR(dfr, 2, i) // // SVAR curNVAR = $curName // // nvarSiz += 4 // endfor for(i = 0; i < CountObjectsDFR(dfr, 1); i += 1) curName = GetIndexedObjNameDFR(dfr, 1, i) WAVE curWAV = $curName wavSiz += wSize(curWav) endfor byteSum += wavSiz + nvarSiz + svarSiz if(numType(depth) == 0) if(curDepth <= depth) Print GetDataFolder(1), byteSum / 2^20 endif endif SetDataFolder dfSave return byteSum End // wSize: Returns a lower bound, in bytes, of an arbitrary wave's size based on its type and length. (Proprietary header // information, dimension labels, etc. are not incorportated.) ThreadSafe Function wSize(wav) WAVE wav String retName // Name of target wave WAVE nullWav // Null wave reference Variable typeCode Variable i, j, k, L Variable siz = 0 Variable sizeOfType = 1 Variable noteSize = 0 switch(WaveType(wav, 1)) case 0: // Null wave return 0 case 3: // DF wave case 4: // WAVE wave // Do nothing return 0 case 2: // Text wave // Cast wav as a text format WAVE/T txtWavCast = $GetWavesDataFolder(wav, 2) switch(WaveDims(txtWavCast)) case 0: return 0 case 1: for(i = 0; i < DimSize(txtWavCast, 0); i += 1) siz += strlen(txtWavCast[i]) endfor break case 2: for(i = 0; i < DimSize(txtWavCast, 0); i += 1) for(j = 0; j < DimSize(txtWavCast, 1); j += 1) siz += strlen(txtWavCast[i][j]) endfor endfor break case 3: for(i = 0; i < DimSize(txtWavCast, 0); i += 1) for(j = 0; j < DimSize(txtWavCast, 1); j += 1) for(k = 0; k < DimSize(txtWavCast, 2); k += 1) siz += strlen(txtWavCast[i][j][k]) endfor endfor endfor break case 4: for(i = 0; i < DimSize(txtWavCast, 0); i += 1) for(j = 0; j < DimSize(txtWavCast, 1); j += 1) for(k = 0; k < DimSize(txtWavCast, 2); k += 1) for(L = 0; L < DimSize(txtWavCast, 3); L += 1) siz += strlen(txtWavCast[i][j][k][L]) endfor endfor endfor endfor break endswitch // Don't forget the wave's note! noteSize = strlen(note(wav)) return siz + noteSize endswitch // Numeric wave typeCode = WaveType(wav) // Need to return an appropriate WAVE reference type Variable waveIsComplex = typeCode & 0x01 Variable waveIs32BitFloat = typeCode & 0x02 Variable waveIs64BitFloat = typeCode & 0x04 Variable waveIs8BitInteger = typeCode & 0x08 Variable waveIs16BitInteger = typeCode & 0x10 Variable waveIs32BitInteger = typeCode & 0x20 Variable waveIsUnsigned = typeCode & 0x40 // Determine wave type size multiplier // inspired by AG, WaveMetrics; igorexchange.com / node / 1845 if(waveIsComplex) sizeOfType *= 2 endif if(waveIs32BitFloat) sizeOfType *= 4 elseif(waveIs64BitFloat) sizeOfType *= 8 elseif(waveIs16BitInteger) sizeOfType *= 2 elseif(waveIs32BitInteger) sizeofType *= 4 endif // Don't forget the wave's note! noteSize = strlen(note(wav)) return numpnts(wav) * sizeOfType + noteSize End

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More