MemoryError при построении больших файлов осциллографа в Ubuntu - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь прочитать большие файлы осциллографа .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. Я нашел его в сети, когда искал способ чтения файлов .trc в python. Если вы знаете лучший способ чтения файлов осциллографа, пожалуйста, дайте мне знать.

Я заархивировал все необходимое для выполнения скрипта в эту папку: папка

(это довольно большой 582MB, потому что каждый файл .trc имеет размер 200MB) Внутри вы найдете скрипт, папку с файлами .trc и внешний файл (модуль) python readTrc который требуется для чтения .trc файлов. Выполнение скрипта должно построить первый файл, но вывести MemoryError при построении / построении второго, по крайней мере, на моем компьютере с Ubuntu. Что меня смущает, так это то, что я получаю только MemoryError на Ubuntu (18.04), а не на Windows 10 .

Буду признателен за помощь, чтобы продолжить мой проект. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Edit:

Single Скачать для readTrc.py

Сингл Скачать для Script.py

print(type(datX)) возвращает:

<class 'numpy.ndarray'>

печать datX возвращает объект со значениями 50 миллионов :

[-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)

MemoryError:

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)

enter image description here enter image description here enter image description here

Причиной этого является чрезвычайно короткий импульсный период сверхвысокочастотных волн (УВЧ). Каждый импульс может состоять только из нескольких значений данных. Если вы установите количество значений, которые будут приняты во внимание, это приведет к большой потере данных. Хотя это решение делает код работающим, оно также значительно уменьшает значение данных.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

О, вау, я не мог видеть дерево для деревьев, как они говорят. Вы пытаетесь построить слишком много точек данных (т. Е. 100000002, я думаю, что это бумага длиной около 4 км, напечатанная с разрешением 600 точек на дюйм), что может быть решено любой из выборок:

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)

или их комбинация.

0 голосов
/ 25 апреля 2019

Прошло довольно много времени, но мне удалось взять под контроль MemoryError.Я должен был не только поставить gc.collect() в конце каждого цикла, но и plt.close().Только тогда ошибки прекратятся.Извините за путаницу.Я многому научился из этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...