使用python收集大量数据
我目前正在使用一个python脚本从外部源(一个数字服务器)收集信号数据,时间大约为10秒。此数据记录为数组,随后使用numpy.savetxt将其保存为文本文件,保存到电脑的硬盘上。这是当前脚本的摘录:使用python收集大量数据,python,ram,large-data,large-files,recording,Python,Ram,Large Data,Large Files,Recording,我目前正在使用一个python脚本从外部源(一个数字服务器)收集信号数据,时间大约为10秒。此数据记录为数组,随后使用numpy.savetxt将其保存为文本文件,保存到电脑的硬盘上。这是当前脚本的摘录: #vs Pia import visa import time import re import datetime from PyDAQmx import * from ctypes import * import nidaqmx import numpy ##############
#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')
代码的第一部分仅仅是从digitiser中提取数据并将其记录在名为“data”的数组中。代码的第二部分是将我需要的相关数据(命名为“dataX”)以及记录数据的总时间保存为单独的文本文件
因此,基本上运行这个脚本收集数据10秒是可以的,但是,长期目标是长时间(一次最多几个月)持续收集数据。不幸的是,PC中有限的RAM意味着这个脚本不能无限期地运行,因为性能和内存问题最终将成为一个因素
到目前为止,我提出的唯一解决方案是定期将数据数组作为文本文件保存到硬盘驱动器,并使用if循环检查文本文件是否达到指定的文件大小。如果已达到指定的大小,则新传入的数据将保存到新的文本文件中,此时整个过程将重复,直到我终止脚本。但是,此解决方案并不理想,因为每次保存文本文件时都需要时间(特别是当文本文件变得非常大时)。这些时间上的“打嗝”可能会造成数据收集时间上的不一致
有没有人有过使用python无限期收集数据的经验?有没有更好的方法来解释RAM中填充的大量数据?一般来说,numpy将使用最少的内存来存储特定类型的N个数字的列表,这些数字必须在手前就知道-这是经常使用的迪
如果对于应用程序的内存需求还不够,考虑更改架构,以便集合设备不存储任何数据本身。
相反,它只能通过网络收集数据并将数据发送到外部服务以进行存储和表示 有针对此类的标准服务和/或,根据使用情况,此类数据库可以用作可视化仪表板的数据源,如 为了保持当前的体系结构,最好在单独的线程中运行收集,以便在将当前数据保存到磁盘的同时继续收集。Numpy是线程安全的,并释放GIL,因此这不是问题在这种情况下,设备必须能够为轮询时间+保存时间存储足够的数据,因为要保存的数据应该被删除,而轮询必须继续,并在旧数据存储到磁盘时存储传入数据。什么是“如果循环”“?您可能希望使用多线程,或者创建一个不同的服务来接收一批数据并将其保存在磁盘上(一个解决方案不排除另一个),这非常有帮助;直到读到这篇文章,我才意识到多线程的概念。谢谢