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
// 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