用python收集大量数据

2024-04-23 09:04:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用python脚本从外部源(digitiser)收集信号数据大约10秒钟。此数据被记录为一个数组,随后使用将其保存为文本文件numpy.savetxt到电脑上的硬盘上。这是当前脚本的摘录:

#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内存有限意味着这个脚本不能无限期地运行,因为性能和内存问题最终会成为一个因素。在

到目前为止,我提出的唯一解决方案是定期将数据数组作为文本文件保存到硬盘上,并使用if循环检查文本文件是否达到指定的文件大小。如果达到指定的大小,新的传入数据将保存到一个新的文本文件中,此时整个过程将重复,直到我终止脚本为止。但是,这个解决方案并不理想,因为每次保存文本文件都需要时间(尤其是当文本文件变得非常大时)。这些“小插曲”在时间上会造成数据收集时间上的不一致。在

有没有人有过使用python无限期收集数据的经验?有没有更好的方法来解释内存中的大量数据?在


Tags: 数据import脚本nonedatatimenp记录
1条回答
网友
1楼 · 发布于 2024-04-23 09:04:39

一般来说,numpy已经为一个特定类型的N个数字的列表使用最少的内存量,这已经被使用了。在

如果这仍然不足以满足应用程序的内存需求,请考虑更改体系结构,使采集设备本身不存储任何数据。在

相反,它只能通过网络收集和发送数据到外部服务进行存储和显示。在

有标准的服务,比如Kafka和/或者,根据用例,InfluxDB这样的数据库可以用作Grafana之类的可视化仪表板的数据源。在

为了保持当前的体系结构,最好在一个单独的线程中运行收集,这样它可以在将当前数据保存到磁盘的同时继续收集。Numpy是线程安全的,并释放GIL,所以这不是问题。在

在这种情况下,设备必须能够为轮询时间+保存时间持续时间存储足够的数据,因为应删除要保存的数据,而轮询必须继续,并在旧数据存储到磁盘时存储传入的数据。在

相关问题 更多 >