使用 python 收集大量数据
Collecting large amounts of data with python
我目前正在使用 python 脚本从外部源(数字转换器)收集信号数据大约 10 秒。此数据被记录为一个数组,随后使用 numpy.savetxt 作为文本文件保存到 PC 上的硬盘驱动器。这是当前脚本的摘录:
#vs Pia
import visa
import time
import re
import datetime
from PyDAQmx import *
from ctypes import *
import nidaqmx
import numpy
##############DATA COLLECTION WITH DIGITISER###############
# initialize variables
N = 2**14
schrate = 1600 #samples per second per channel
taskHandle = TaskHandle(0)
read = int32()
data = np.zeros((N,), dtype=np.float64)
DAQmxCreateTask("", byref(taskHandle))
DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai4:5", "", DAQmx_Val_RSE, -10.0,
10.0, DAQmx_Val_Volts, None)
DAQmxCfgSampClkTiming(taskHandle, "", schrate, DAQmx_Val_Rising,
DAQmx_Val_FiniteSamps, N)
# begin data collection
DAQmxStartTask(taskHandle)
DAQmxReadAnalogF64(taskHandle, -1, 30, DAQmx_Val_GroupByScanNumber, data, N,
byref(read), None)
DAQmxStopTask(taskHandle)
DAQmxClearTask(taskHandle)
#############SAVING DATA##############
dataX = data[::2]
time = np.linspace(0,(N/2)/schrate,N/2)
filename = "Xquad"
print("Saving X-quadrature to file: "+filename)
np.savetxt(filename, dataX[None,:], delimiter=',',newline='\n')
filename = "recorded_time"
print("Saving recorded time to file: "+filename)
numpy.savetxt(filename, time[None,:], delimiter=',',newline='\n')
代码的第一部分只是从数字转换器中提取数据并将其记录在名为 "data" 的数组中。代码的第二部分是保存我需要的相关数据,命名为 "dataX",以及记录数据的总时间,两者都是单独的文本文件。
所以基本上 运行使这个脚本收集数据 10 秒就可以了,但是,长期目标是长时间连续收集数据(一次最多几个月)。不幸的是,PC 中有限的 RAM 意味着这个脚本不能无限期地 运行 因为性能和内存问题最终将开始成为一个因素。
目前我唯一提出的解决方案是定期将数据数组作为文本文件保存到硬盘,并使用if循环检查文本文件是否达到指定的文件大小。如果它已经达到指定的大小,新的传入数据将被保存到一个新的文本文件中,此时将重复整个过程,直到我终止脚本。但是,此解决方案并不理想,因为每次保存文本文件都需要时间(尤其是当文本文件变得非常大时)。这些时间“打嗝”可能会导致数据收集时间不一致。
有没有人有过使用 python 无限期收集数据的经验?有没有更好的方法来解释填满 RAM 的大量数据?
一般来说,numpy 已经为特定类型的 N 个数字的列表使用了最少的内存,这必须事先知道 - 这已经被使用了。
如果这仍然不能满足应用程序的内存要求,请考虑更改架构,以便收集设备本身不存储任何数据。
相反,它只能收集数据并将其通过网络发送到外部服务进行存储和展示。
像 Kafka and/or, depending on the use case, databases like InfluxDB that can be used as data sources for visualisation dashboards like Grafana 这样的标准服务。
要保持当前的体系结构,最好 运行 在一个单独的线程中收集,这样它就可以在将当前数据保存到磁盘的同时继续收集。 Numpy 是线程安全的并且发布了 GIL,所以这不是问题。
在这种情况下,设备必须能够为轮询时间 + 保存持续时间存储足够的数据,因为应该删除 to-be-saved 数据,而轮询必须继续并在存储旧数据时存储传入数据到磁盘。
我目前正在使用 python 脚本从外部源(数字转换器)收集信号数据大约 10 秒。此数据被记录为一个数组,随后使用 numpy.savetxt 作为文本文件保存到 PC 上的硬盘驱动器。这是当前脚本的摘录:
#vs Pia
import visa
import time
import re
import datetime
from PyDAQmx import *
from ctypes import *
import nidaqmx
import numpy
##############DATA COLLECTION WITH DIGITISER###############
# initialize variables
N = 2**14
schrate = 1600 #samples per second per channel
taskHandle = TaskHandle(0)
read = int32()
data = np.zeros((N,), dtype=np.float64)
DAQmxCreateTask("", byref(taskHandle))
DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai4:5", "", DAQmx_Val_RSE, -10.0,
10.0, DAQmx_Val_Volts, None)
DAQmxCfgSampClkTiming(taskHandle, "", schrate, DAQmx_Val_Rising,
DAQmx_Val_FiniteSamps, N)
# begin data collection
DAQmxStartTask(taskHandle)
DAQmxReadAnalogF64(taskHandle, -1, 30, DAQmx_Val_GroupByScanNumber, data, N,
byref(read), None)
DAQmxStopTask(taskHandle)
DAQmxClearTask(taskHandle)
#############SAVING DATA##############
dataX = data[::2]
time = np.linspace(0,(N/2)/schrate,N/2)
filename = "Xquad"
print("Saving X-quadrature to file: "+filename)
np.savetxt(filename, dataX[None,:], delimiter=',',newline='\n')
filename = "recorded_time"
print("Saving recorded time to file: "+filename)
numpy.savetxt(filename, time[None,:], delimiter=',',newline='\n')
代码的第一部分只是从数字转换器中提取数据并将其记录在名为 "data" 的数组中。代码的第二部分是保存我需要的相关数据,命名为 "dataX",以及记录数据的总时间,两者都是单独的文本文件。
所以基本上 运行使这个脚本收集数据 10 秒就可以了,但是,长期目标是长时间连续收集数据(一次最多几个月)。不幸的是,PC 中有限的 RAM 意味着这个脚本不能无限期地 运行 因为性能和内存问题最终将开始成为一个因素。
目前我唯一提出的解决方案是定期将数据数组作为文本文件保存到硬盘,并使用if循环检查文本文件是否达到指定的文件大小。如果它已经达到指定的大小,新的传入数据将被保存到一个新的文本文件中,此时将重复整个过程,直到我终止脚本。但是,此解决方案并不理想,因为每次保存文本文件都需要时间(尤其是当文本文件变得非常大时)。这些时间“打嗝”可能会导致数据收集时间不一致。
有没有人有过使用 python 无限期收集数据的经验?有没有更好的方法来解释填满 RAM 的大量数据?
一般来说,numpy 已经为特定类型的 N 个数字的列表使用了最少的内存,这必须事先知道 - 这已经被使用了。
如果这仍然不能满足应用程序的内存要求,请考虑更改架构,以便收集设备本身不存储任何数据。
相反,它只能收集数据并将其通过网络发送到外部服务进行存储和展示。
像 Kafka and/or, depending on the use case, databases like InfluxDB that can be used as data sources for visualisation dashboards like Grafana 这样的标准服务。
要保持当前的体系结构,最好 运行 在一个单独的线程中收集,这样它就可以在将当前数据保存到磁盘的同时继续收集。 Numpy 是线程安全的并且发布了 GIL,所以这不是问题。
在这种情况下,设备必须能够为轮询时间 + 保存持续时间存储足够的数据,因为应该删除 to-be-saved 数据,而轮询必须继续并在存储旧数据时存储传入数据到磁盘。