使用python收集大量数据

时间:2018-04-11 14:36:56

标签: python ram large-data large-files recording

我目前正在使用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的大量数据?

1 个答案:

答案 0 :(得分:1)

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

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

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

有一些标准服务,例如Kafka和/或根据用例,InfluxDB等数据库可用作Grafana等可视化仪表板的数据源。< / p>

要保持当前体系结构,最好在单独的线程中运行集合,以便在将当前数据保存到磁盘时继续收集。 Numpy是线程安全的并且释放GIL所以这不是问题。

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