我曾将包含传感器数据的非常大的tdms文件读入numpy数组的列表中,结构如下:几个文件的数据存储在名为file_data的对象实例中。结构如下:来自几个文件的数据被存储在一个名为file_data的对象的实例中,这个对象有每个传感器类型的属性,基本上是numpy数组的列表。该对象有每个传感器类型的属性,基本上是numpy数组的列表(该传感器类型的每个传感器都有一个)。
我想知道我在这里存储了多少数据(因为Labview生成的tdms文件的大小似乎意义不大,包括所有的元数据)。
这就是代码。
# Check memory
total = 0
file_data = [file_data1, file_data2, ...] # list of data objects read from six files
for no, f in enumerate(file_data):
sensor_types = [f.sensortype1, f.sensortype2, ...] # list of sensor types
sum = 0
for sensor_type in sensor_types: # list
for data in sensor_type: #np.array
sum += (data.size * data.itemsize)
total += sum
print('Data from file {}, size: {:.2f} GB'.format(no+1, sum/(1024**3)))
print('Total memory: {:.2f} GB'.format(total/(1024**3)))
现在这给了我以下的输出:
数据来自文件1,大小: 2.21 GB。
数据来自文件2,大小:1.88 GB
数据来自文件3,大小:2.27 GB
数据来自文件4,大小:1.53 GB
数据来自文件5,大小:1.01 GB
数据来自文件6,大小:0.66 GB
总内存:9.56 GB
但我正在研究一个 8GB内存 Mac,所以这个数字真的让我很惊讶,因为程序没有崩溃,我可以用数据工作。我哪里弄错了?
我猜你用的是 npTDMS.
使用过的 numpy.array
类型不仅仅是一个简单的数组,所有的数组元素总是存储在内存中.虽然数据类型和元素数量是已知的(在这种情况下,通过从TDMS文件中读取元数据),但元素在被请求之前不会被读取。
也就是说。如果你想要20GB记录中的最后一个元素,npTDMS知道它在文件中的位置,读取并返回它--而不需要读取前20GB。