Я пытаюсь прочитать большие файлы осциллографа .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)

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