Я полагаю, что у меня есть проблема памяти с помощью 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, но это должно быть что-то подобное. Кто-либо знает о хорошем методе?
Является ли подпроцесс просто консольным приложением? Я не писал службы 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. Все, что работает.)
Обновление : Я включил в ответ отличное предложение 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
Это должно помешать менеджеру памяти перебрать слишком много. Я попробовал это против строка _ стек
на каждой итерации и он работал на пару порядков быстрее.
Используйте списки Python. Серьезно, они растут намного эффективнее. Вот для чего они предназначены. Они очень эффективны в этой обстановке.
Если вам нужно создать из них массив в конце (или даже иногда в середине этого вычисления), будет гораздо эффективнее сначала собрать их в списке.