gpt4 book ai didi

python - 用python收集大量数据

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:16 25 4
gpt4 key购买 nike

我目前正在使用 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')

代码的第一部分只是从数字转换器中提取数据并将其记录在名为“数据”的数组中。代码的第二部分是保存我需要的相关数据,命名为“dataX”,以及记录数据的总时间,两者都是单独的文本文件。

所以基本上运行此脚本以收集数据 10 秒就可以了,但是,长期目标是长时间连续收集数据(一次最多几个月)。不幸的是,PC 中有限的 RAM 意味着这个脚本不能无限期地运行,因为性能和内存问题最终将开始成为一个因素。

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

有没有人有使用 python 无限期收集数据的经验?有没有更好的方法来解释填满 RAM 的大量数据?

最佳答案

一般来说,numpy 已经使用最少的内存来存储特定类型的 N 个数字的列表,这必须事先知道 - 这已经被使用了。

如果这仍然不能满足应用程序的内存要求,请考虑更改架构,以便收集设备本身不存储任何数据。

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

有类似 Kafka 的标准服务和/或,根据用例,数据库如 InfluxDB可用作可视化仪表板的数据源,如 Grafana .

要保持当前架构,最好在单独的线程中运行收集,这样它可以在将当前数据保存到磁盘的同时继续收集。 Numpy 是线程安全的并且发布了 GIL,所以这不是问题。

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

关于python - 用python收集大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49777932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com