Ошибка памяти! используя мне набор данных
Я пытаюсь использовать набор данных "visual_92_categories" mne-python, но когда я хочу выполнить фильтрацию и извлечь эпохи, я получаю ошибку памяти! моя оперативная память 7G. Мне интересно, может ли кто-нибудь помочь мне. Есть ли какие-либо ограничения памяти с ноутбуком Python или Jupyter? Спасибо
data_path = visual_92_categories.data_path()
# Define stimulus - trigger mapping
fname = op.join(data_path, 'visual_stimuli.csv')
conds = read_csv(fname)
max_trigger = 92
conds = conds[:max_trigger]
conditions = []
for c in conds.values:
cond_tags = list(c[:2])
cond_tags += [('not-' if i == 0 else '') + conds.columns[k]
for k, i in enumerate(c[2:], 2)]
conditions.append('/'.join(map(str, cond_tags)))
print(conditions[24])
event_id = dict(zip(conditions, conds.trigger + 1))
n_runs = 4 # 4 for full data (use less to speed up computations)
fname = op.join(data_path, 'sample_subject_%i_tsss_mc.fif')
raws = [read_raw_fif(fname % block) for block in range(n_runs)]
raw = concatenate_raws(raws)
events = mne.find_events(raw, min_duration=.002)
events = events[events[:, 2] <= max_trigger]
picks = mne.pick_types(raw.info, meg=True)
epochs = mne.Epochs(raw, events=events, event_id=event_id, baseline=None,
picks=picks, tmin=-.1, tmax=.500, preload=True)
y = epochs.events[:, 2]
X1 = epochs.copy().get_data()
1 ответ
Для выполнения этого кода мне нужно более 7 ГБ памяти. Даже X1
массив составляет около 4 Гб. Но это тип float64
, так что если вы не можете получить больше памяти, попробуйте сохранить ее как float32
(потребление памяти будет уменьшено вдвое). Это приемлемое снижение точности в большинстве случаев.
Также вы, вероятно, можете попытаться обработать блок данных за блоком, сохранить его на диск как numpy.array, а когда он будет завершен, загрузить и объединить массивы:
# leaving initial part intact
import pickle # need to save a data
for block in range(n_runs):
raw = mne.io.read_raw_fif(fname % block)
# raw = concatenate_raws(raws)
events = mne.find_events(raw, min_duration=.002)
events = events[events[:, 2] <= max_trigger]
picks = mne.pick_types(raw.info, meg=True)
try:
epochs = mne.Epochs(raw, events=events, event_id=event_id, base
line=None,
picks=picks, tmin=-.1, tmax=.500, preload=True)
except ValueError: # there's no correct data in some blocks, catch exception
continue
y = epochs.events[:, 2].astype('float32')
X1 = epochs.copy().get_data().astype('float32')
pickle.dump(y, open('y_block_{}.pkl'.format(block), 'wb')) # use convenient names
pickle.dump(X1, open('x_block_{}.pkl'.format(block), 'wb'))
# remove unnecessary objects from memory
del y
del X1
del raw
del epochs
X1 = None # strore x_arrays
y = None # sore y_s
for block in range(n_runs):
try:
if X1 is None:
X1 = pickle.load(open('x_block_{}.pkl'.format(block), 'rb'))
y = pickle.load(open('y_block_{}.pkl'.format(block), 'rb'))
else:
X1 = np.concatenate((X1, pickle.load(open('x_block_{}.pkl'.format(block), 'rb'))))
y = np.concatenate((y, pickle.load(open('y_block_{}.pkl'.format(block), 'rb'))))
except FileNotFoundError: # if no such block from the previous stage
pass
Итак, этот код работает для меня без исчерпания памяти (т. Е. < 7 Гб), но я не совсем уверен, что mne
обрабатывает все блоки независимо, и это эквивалентный код. По крайней мере, этот код создает массив без ~0,5% выборок. Кто-то более опытный с mne
чем я, вероятно, это исправить.