Проблема матрицы элементов памяти Numpy

Я полагаю, что у меня есть проблема памяти с помощью numpy массивы. Следующий код выполняется в течение многих часов подряд:

    new_data = npy.array([new_x, new_y1, new_y2, new_y3])
    private.data = npy.row_stack([private.data, new_data])

где new_x, new_y1, new_y2, new_y3 являются плаваниями.

Приблизительно после 5 часов записи этих данных каждую секунду (больше чем 72 000 плаваний), программа становится безразличной. То, что я думаю, происходит, некоторое перевыделение и операция копии, которая затопляет процесс. Кто-либо знает, является ли это тем, что происходит?

Мне нужен способ записать эти данные, не встречаясь с этой проблемой замедления. Нет никакого способа знать даже приблизительно размер этого массива заранее. Это должно не обязательно использовать массив numpy, но это должно быть что-то подобное. Кто-либо знает о хорошем методе?

5
задан Brian Tompsett - 汤莱恩 1 December 2015 в 23:20
поделиться

2 ответа

Является ли подпроцесс просто консольным приложением? Я не писал службы Windows, но я думаю, что просто запустить подпроцесс без окна будет достаточно. Используйте перегрузку Process.Start, которая принимает ProcessStartInfo и устанавливает для ProcessStartInfo.CreateNoWindow значение true.

http ://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

-121-2218516-

Моя команда:

command -range=% -nargs=* Tidy <line1>,<line2>!
  \perltidy (your default options go here) <args>

Если вы используете визуальный выбор или предоставляете диапазон, он приведет в порядок выбранный диапазон, в противном случае Вы можете поместить набор параметров по умолчанию (если у вас есть) в точку, где я написал (ваши параметры по умолчанию идут здесь) , но любые аргументы, которые вы предоставляете : Tidy будут добавлены к perltidy командной строке, переопределяя ваши параметры по умолчанию. (Если вы используете .perltidyrc , у вас может не быть аргументов по умолчанию - это нормально - но опять же вы можете иметь по умолчанию, как --profile = vim , который устанавливает значения по умолчанию только для тех случаев, когда вы работаете в vim. Все, что работает.)

-121--2661091-

Обновление : Я включил в ответ отличное предложение EOL по индексации.

Проблема может быть в том, как строка _ стек увеличивает адресата. Возможно, вам лучше самим справиться с перераспределением. Следующий код выделяет большой пустой массив, заполняет его и увеличивает его по мере того, как он заполняет час за один раз

numcols = 4
growsize = 60*60 #60 samples/min * 60 min/hour
numrows = 3*growsize #3 hours, to start with
private.data = npy.zeros([numrows, numcols]) #alloc one big memory block
rowctr = 0
while (recording):
    private.data[rowctr] = npy.array([new_x, new_y1, new_y2, new_y3])
    rowctr += 1
    if (rowctr == numrows): #full, grow by another hour's worth of data
        private.data = npy.row_stack([private.data, npy.zeros([growsize, numcols])])
        numrows += growsize

Это должно помешать менеджеру памяти перебрать слишком много. Я попробовал это против строка _ стек на каждой итерации и он работал на пару порядков быстрее.

2
ответ дан 14 December 2019 в 19:11
поделиться

Используйте списки Python. Серьезно, они растут намного эффективнее. Вот для чего они предназначены. Они очень эффективны в этой обстановке.

Если вам нужно создать из них массив в конце (или даже иногда в середине этого вычисления), будет гораздо эффективнее сначала собрать их в списке.

3
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: