【发布时间】:2019-04-22 06:59:15
【问题描述】:
我正在尝试读取大型示波器.trc 文件并绘制它们。绘制一个文件有效,但是一旦我将脚本放入循环中,尝试绘制所有文件(1 个文件一个循环),我就会得到一个MemoryError。
代码:
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import readTrc #external file, same location as script
foldername = 'trc_folder'
folder = os.listdir(foldername)
path = os.path.dirname(os.path.realpath(__file__))
for filenumber, i in enumerate(folder):
trc = path + '/' + foldername + '/' + i
print('reading trc file ' + str(filenumber))
datX, datY, m = readTrc.readTrc(trc)
srx, sry = pd.Series(datX * 1000), pd.Series(datY * 1000)
df_oszi = pd.concat([srx, sry], axis = 1)
df_oszi.set_index(0, inplace = True)
#ERROR APPEARS with xticks argument
#removing xticks does not help, because then errorpath changes to
#/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py
df_oszi.plot(grid = 1,
color = 'blue',
linewidth = 0.5,
figsize = (9,5),
legend = False,
xticks = np.arange(df_oszi.index[0], df_oszi.index[-1], 1))
print('plotting file ' + str(filenumber))
plt.savefig('Plot_' + str(filenumber) + '.png', dpi = 300)
问题似乎出在外部模块readTrc 上。我花了很长时间才弄清楚这一点,因为 python 在 Matplotlib 和 Pandas 而不是 readTrc 周围抛出错误,这似乎是一个用于读取 .trc 文件的非官方脚本。我在网上找到了它,因为我正在寻找一种在 python 中读取.trc 文件的方法。如果您知道更好的读取示波器文件的方法,请告诉我。
我将执行脚本所需的所有内容压缩到此文件夹:folder
(这是相当大的582MB,因为每个.trc 文件大约是200MB 大小)在里面你会找到脚本,一个包含.trc 文件的文件夹和外部python 文件(模块)@987654344 @ 这是读取 .trc 文件所必需的。执行脚本应该绘制第一个文件,但在绘制/构造第二个文件时抛出MemoryError,至少在我的 Ubuntu 机器上。让我感到困惑的是,我只能在 Ubuntu (18.04) 上得到这个 MemoryError,而不是在 Windows 10 上。
非常感谢您的帮助,以便我可以继续我的项目。如果您需要更多信息,请告诉我。
编辑:
readTrc.py 的单一下载
Script.py 的单一下载
print(type(datX)) 返回:
<class 'numpy.ndarray'>
打印 datX 返回一个具有 5000 万 个值的对象:
[-0.005 -0.005 -0.005 ... 0.005 0.005 0.005]
这些是由print() 函数舍入的,它们是:
-0.004999999906663635
-0.004999999806663634
-0.004999999706663633
-0.004999999606663631
-0.00499999950666363
编辑 2:
要使用新版本的readTrc 运行代码,请进行以下更改:
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import readTrc
foldername = 'trc_folder'
folder = os.listdir(foldername)
path = os.path.dirname(os.path.realpath(__file__))
for filenumber, i in enumerate(folder):
trc = path + '/' + foldername + '/' + i
print('reading trc file ' + str(filenumber))
datX, datY, d = readTrc.Trc().open(trc)
srx, sry = pd.Series(datX * 1000), pd.Series(datY * 1000)
df_oszi = pd.concat([srx, sry], axis = 1)
df_oszi.set_index(0, inplace = True)
df_oszi.plot(grid = 1,
color = 'blue',
linewidth = 0.5,
figsize = (9,5),
legend = False,
xticks = np.arange(df_oszi.index[0], df_oszi.index[-1], 1))
print('plotting file ' + str(filenumber))
plt.savefig('Plot_' + str(filenumber) + '.png', dpi = 300)
内存错误:
Traceback (most recent call last):
File "/home/artur/Desktop/zip_original/Script.py", line 27, in <module>
xticks = np.arange(df_oszi.index[0], df_oszi.index[-1], 1))
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 2941, in __call__
sort_columns=sort_columns, **kwds)
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 1977, in plot_frame
**kwds)
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 1804, in _plot
plot_obj.generate()
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 260, in generate
self._make_plot()
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 985, in _make_plot
**kwds)
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 1001, in _plot
lines = MPLPlot._plot(ax, x, y_values, style=style, **kwds)
File "/usr/local/lib/python3.6/dist-packages/pandas/plotting/_core.py", line 615, in _plot
return ax.plot(*args, **kwds)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/__init__.py", line 1805, in inner
return func(ax, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py", line 1604, in plot
self.add_line(line)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py", line 1891, in add_line
self._update_line_limits(line)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py", line 1913, in _update_line_limits
path = line.get_path()
File "/usr/local/lib/python3.6/dist-packages/matplotlib/lines.py", line 945, in get_path
self.recache()
File "/usr/local/lib/python3.6/dist-packages/matplotlib/lines.py", line 649, in recache
self._xy = np.column_stack(np.broadcast_arrays(x, y)).astype(float)
MemoryError
编辑 3:
对数据集进行采样似乎会降低数据值。这些是与sampling = 1, sampling = 10, sampling = 100 相同数据集的示例
srx, sry = pd.Series(datX[::sampling] * 1000), pd.Series(datY[::sampling] * 1000)
这是因为超高频波 (UHF) 的脉冲周期极短。每个脉冲只能由几个数据值组成。如果您设置考虑的值的数量,则会导致大量数据丢失。这个方案虽然让代码可以工作,但也大大降低了数据价值。
【问题讨论】:
-
您也可以只上传
readTrc.py文件吗?我真的不想为此下载~600MB :-) 除此之外:print(type(datX))的回报是什么?是list、numpy.ndarray、dataframe?您是否尝试过使用this readTrc module? -
请在编辑-部分中找到所要求的信息
-
关于
readTrc module:看来我使用的是2017年以来此文件的旧版本。我只是试图用新文件替换旧版本,但似乎需要额外的努力才能做到这一点工作。我会尝试用新版本运行脚本。 -
好吧,所以如果
datX=[1,2,3]真的是一个列表(可惜你没有发布print(type(datX))的返回),那么print(10*a)会给你[1, 2, 3, 1, 2, 3,…..],即列表,乘以十.这可能不是你想要的,所以首先尝试使其成为一个 numpy 数组,即在调用readTrc.readTrc()之后,datX=np.array(datX)和datY=np.array(datY) -
抱歉,我将
print()与print(type())混淆了。我将它添加到 Edit-Section。实际上是<class 'numpy.ndarray'>
标签: python-3.x pandas matplotlib