np.unique работает, сортируя сплющенный массив, а затем смотрит, равен ли каждый элемент предыдущему. Это можно сделать вручную без сглаживания:
ind = np.lexsort(a.T)
a[ind[np.concatenate(([True],np.any(a[ind[1:]]!=a[ind[:-1]],axis=1)))]]
Этот метод не использует кортежи и должен быть намного быстрее и проще, чем другие методы, приведенные здесь.
ПРИМЕЧАНИЕ. Предыдущая версия из этого не было ind ind сразу после [, что означает, что использовались неправильные индексы. Кроме того, Джо Кингтон хорошо говорит о том, что этот делает множество различных промежуточных копий. Следующий метод делает меньше, создавая отсортированную копию и затем используя ее виды:
b = a[np.lexsort(a.T)]
b[np.concatenate(([True], np.any(b[1:] != b[:-1],axis=1)))]
Это быстрее и использует меньше памяти.
Кроме того, если вы хотите найти уникальные строки в ndarray , независимо от того, сколько измерений в массиве, будут работать следующие:
b = a[lexsort(a.reshape((a.shape[0],-1)).T)];
b[np.concatenate(([True], np.any(b[1:]!=b[:-1],axis=tuple(range(1,a.ndim)))))]
Интересной оставшейся проблемой будет, если вы хотите сортировать / уникально
Edit:
Чтобы продемонстрировать разницу в скорости, я провел несколько тестов в ipython из трех различные методы, описанные в ответах. С ваш точный a, разница не слишком велика, хотя эта версия немного быстрее:
In [87]: %timeit unique(a.view(dtype)).view('<i8')
10000 loops, best of 3: 48.4 us per loop
In [88]: %timeit ind = np.lexsort(a.T); a[np.concatenate(([True], np.any(a[ind[1:]]!= a[ind[:-1]], axis=1)))]
10000 loops, best of 3: 37.6 us per loop
In [89]: %timeit b = [tuple(row) for row in a]; np.unique(b)
10000 loops, best of 3: 41.6 us per loop
При большей версии, однако, эта версия заканчивается намного быстрее:
In [96]: a = np.random.randint(0,2,size=(10000,6))
In [97]: %timeit unique(a.view(dtype)).view('<i8')
10 loops, best of 3: 24.4 ms per loop
In [98]: %timeit b = [tuple(row) for row in a]; np.unique(b)
10 loops, best of 3: 28.2 ms per loop
In [99]: %timeit ind = np.lexsort(a.T); a[np.concatenate(([True],np.any(a[ind[1:]]!= a[ind[:-1]],axis=1)))]
100 loops, best of 3: 3.25 ms per loop
Существует несколько решений, обеспечивающих постоянную работу вашего сервиса.
Один из них даже называется forever
. Здесь у вас есть обзор, подготовленный Экспресс .
Однако для производственных услуг я рекомендую пассажира Результат почти такой же, но гораздо большей масштабируемости. Например, вы можете настроить автоматическое добавление другого экземпляра.
Почти - потому что он предназначен для обеспечения доступности HTTP, а не постоянной работы приложения.
КСТАТИ: служба останавливается, потому что у вас есть исключение исключено.
Если вы настаиваете на forever
, то: (Мы говорим о том же навсегда ?)
forever
имеет отдельных менеджеров для всех пользователей. cron
отличается от ручного запуска (переменные в env
)) forever
имеет --pidFile
- тогда очень легко проверить, работает ли процесс ps -aux | grep node
должен быть твоим большим другом. Нет, я не объединила это. Когда у меня начались проблемы, я переключился на passenger
. В конце концов, я сделал это хорошо, потому что у меня есть профессиональный мониторинг, который я запустил за меньшее время, чем поиск, как объединить вышеупомянутые пункты.