提取数据的过程
我正在使用matlab代码分析4000到8000个DICOM文件。使用dicomread()
函数读取DICOM文件。每个DICOM文件包含来自7个探测器的932 * 128个光子计数数据。在读取DICOM文件时,我将数据转换为double并存储在7个cell array
变量中(来自7个检测器)。因此每个单元包含128 * 128个光子计数数据,并且单元阵列包含4000到8000个单元。
问题。
当我单独保存每个变量时,每个变量的大小为3GB。因此,对于7个变量,它将是21GB,保存它们并且回读需要花费大量时间。 (我电脑的RAM是4GB) 有没有办法减少变量的大小?
感谢。
答案 0 :(得分:2)
不同的数据类型会有所帮助。您可以将数据保存为float而不是double,因为DICOM文件也将其保存为float(来自http://northstar-www.dartmouth.edu/doc/idl/html_6.2/DICOM_Attributes.html; Graphic Data)。这个尺寸减半。在对数据进行操作时,您可能希望扩展为double,以避免不准确的爬行。 通过将其保存为uint16(额外的x2空间节省)甚至uint8(x4)可以实现额外的压缩,但我会对此保持警惕 - 它可能在所有测试用例中都很好用,但在你最不期望的时候会出现问题。
单元阵列在速度或大小方面没有问题 - 你不会通过切换到别的东西来获得(很多)。您的数据吞噬了内存,而不是单元阵列本身。如果您愿意,可以将数据保存在128x128x7x8000浮点数组中 - 它也可以正常工作。 但是如果图像的数量(这个4000-8000)在任何时候都可以增加,那么在空间和时间方面重新调整阵列将是一项非常昂贵的操作。单元阵列更容易扩展 - 移动8k值而不是8k * 115k = 900M值。
另一个选择是以块的形式分隔数据。您可能不需要同时处理所有4000张图像。您可以加载500个图像,完成它们的工作,继续下一个500个图像等。批量大小显然取决于您的硬件以及您对数据进行的处理,但我猜大约500个可能是一个非常合理的起点。