N-body simulation은 입자 상호 작용이 포함 된 물리적 시스템의 동적 인 시뮬레이션 또는 물리적 의미를 지닌 어떤 종류의 입자로 축소 된 문제에 사용됩니다. 입자는 은하계의 기체 분자 또는 별일 수 있습니다. 입자 개체가 단순히 NumPy와 배열 여기dask를 통한 효율적인 n 바디 시뮬레이션
class ParticleGenerator():
def __init__(self, num_of_particles, max_position, seed=time.time()):
random.seed(seed)
self.index = -1
self.limit = num_of_particles
self.max_position = max_position
def __iter__(self):
return self
def __next__(self):
self.index += 1
if self.index < self.limit :
return np.array([self.max_position*random.random(), self.max_position*random.random(), self.max_position*random.random()])
else :
raise StopIteration
b = db.from_sequence(ParticleGenerator(1000, 1, seed=123456789))
하지만 수 : Dask.bag는 입자 개체를 반환하는 사용자 정의 반복자를, dask.bag.from_sequence()
제공, 예를 들어, 클러스터의 입자를 배포 할 수있는 간단한 방법을 제공합니다 뭐든지있어. 이제 모든 입자 사이의 상호 작용을 계산하기 위해 위치, 속도 및 유사한 양에 대한 정보를 공유해야합니다. dask.bag.map
은 컬렉션의 모든 요소에 대해 함수를 매핑합니다.이 함수 내에서 요소와 다른 모든 입자 사이의 상호 작용을 계산하여 새 입자 상태를 얻습니다.
def update_position(e, others=None, mass=1, dt=1e-4):
f = np.zeros(3)
for o in others:
r = e - o
r_mag = np.sqrt(r.dot(r))
if r_mag == 0 :
continue
f += (A/(r_mag**7) + B/(r_mag**13)) * r
return e + f * (dt**2/mass)
A
및 B
일부 임의 값 :
b = b.map(update_position, others=list(b))
b.compute()
는 completitude, 이것은 update_position
함수이다. 루프 내에서 dask.bag.map()
을 여러 번 호출하여 시뮬레이션을 실행할 수 있습니다.
Dask.bag
이 종류의 문제를 처리하기위한 좋은 컬렉션 (추상화)입니까? 어쩌면 Dask.distributed가 더 좋은 아이디어일까요?- 시뮬레이션을 프로그래밍하면, 모든 통신을 처리하는 스케줄러 또는 위치, 속도 등에 대한 정보가 작업자 간 통신과 공유됩니까?
- 코드를 최적화하기위한 모든 의견은 있습니까?
dask.bag.map()
을 호출하는 동안 컬렉션을 목록으로 변환하는 데 과열 된 경우 특히 그렇습니다.