Python 3.x 在Ubuntu上绘制大型示波器文件时出现内存错误

Python 3.x 在Ubuntu上绘制大型示波器文件时出现内存错误,python-3.x,pandas,matplotlib,Python 3.x,Pandas,Matplotlib,我正在尝试读取大型示波器.trc文件并绘制它们。打印一个文件是可行的,但一旦我将脚本放入循环,尝试打印所有文件(一个循环打印一个文件),我就会得到一个MemoryError 代码: 问题似乎出在外部模块readTrc上。我花了很长时间才弄明白这一点,因为python在Matplotlib和Pandas周围抛出错误,而不是readTrc,后者似乎是用于读取.trc文件的非官方脚本。我在网上找到它,当时我正在寻找一种读取python中.trc文件的方法。如果您知道读取示波器文件的更好方法,请告诉我

我正在尝试读取大型示波器
.trc
文件并绘制它们。打印一个文件是可行的,但一旦我将脚本放入循环,尝试打印所有文件(一个循环打印一个文件),我就会得到一个
MemoryError

代码:

问题似乎出在外部模块
readTrc
上。我花了很长时间才弄明白这一点,因为python在
Matplotlib
Pandas
周围抛出错误,而不是
readTrc
,后者似乎是用于读取
.trc
文件的非官方脚本。我在网上找到它,当时我正在寻找一种读取python中
.trc
文件的方法。如果您知道读取示波器文件的更好方法,请告诉我

我已将执行脚本所需的所有内容压缩到此文件夹:

(它相当大,
582MB
,因为每个
.trc
文件大约有
200MB
大小)在里面你会找到脚本,一个包含
.trc
文件的文件夹和外部python文件(模块)
readTrc
,这是读取
.trc
文件所必需的。执行脚本应该打印第一个文件,但在打印/构建第二个文件时抛出一个
MemoryError
,至少在我的Ubuntu机器上是这样。让我困惑的是,我只在Ubuntu(18.04)上得到了这个
内存错误,而不是在Windows 10

我将感谢帮助,以便我可以继续我的项目。如果您需要更多信息,请告诉我

编辑:

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
单次下载

单次下载

打印(类型(datX))
返回:

<class 'numpy.ndarray'>
这些是由
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


原因是超高频波(UHF)的脉冲周期极短。每个脉冲只能由几个数据值组成。如果您设置要考虑的值的数量,这将导致大量数据丢失。虽然这个解决方案使代码能够工作,但它也显著降低了数据值。

哦,哇,我看不到树木的树木,就像他们说的那样。 您试图绘制太多的数据点(即
10000002
,我认为这大约是以600dpi打印的4km长的纸张),可以通过以下两种方式解决:

sampling=100
srx, sry = pd.Series(datX[::sampling] * 1000), pd.Series(datY[::sampling] * 1000)
或者通过选择性地研究特定范围:

srx, sry = pd.Series(datX[0:50000] * 1000), pd.Series(datY[0:50000] * 1000)

或者两者兼而有之

这花了相当长的时间,但我设法控制了
内存错误。我不仅要在每个循环的末尾放入
gc.collect()
,而且还要放入
plt.close()
。只有这样错误才会停止。很抱歉给你带来了困惑。我从中学到了很多。

您是否可以只上传
readTrc.py
文件?我真的不想为此下载~600MB:-)除此之外:
print(type(datX))
的返回值是多少?它是一个
列表
、一个
numpy.ndarray
、一个
数据帧
?您是否尝试过使用?请在编辑部分找到有关
readTrc模块的所需信息
:似乎我使用的是2017年的旧版本文件。我只是试着用新的替换旧的,但它似乎需要额外的努力才能工作。我将尝试使用新版本运行脚本。好的,如果
datX=[1,2,3]
确实是一个列表(不幸的是,您没有发布
print(type(datX))
,那么
print(10*a)
将给您
[1,2,3,1,2,3,…]
,即列表,乘以10。这可能不是您想要的,所以请首先尝试将其设置为numpy数组,即
datX=np.array(datX)
datY=np.array(datY)
在调用
readTrc.readTrc()
之后立即将
print()
print(type())
混淆。我把它添加到编辑部分。事实上,这是一个
感谢您迄今为止的努力。你帮了我很多。虽然我很担心,但我无法实现这个解决方案。请参阅“编辑3”部分。恐怕您将可见功能与现有功能混淆了。短脉冲是否在绘图中可见取决于您的体形大小/分辨率/缩放。您需要找到一种使数据量最小化的方法,可能通过FFT对信号进行处理,或者通过丢弃数值,例如np.abs(y)
sampling=100
srx, sry = pd.Series(datX[::sampling] * 1000), pd.Series(datY[::sampling] * 1000)
srx, sry = pd.Series(datX[0:50000] * 1000), pd.Series(datY[0:50000] * 1000)