옵투나 공유메모리로로
This commit is contained in:
@@ -346,9 +346,29 @@ class SharedTickStore:
|
||||
self._shms = {}
|
||||
|
||||
def attach_mapping(self) -> SharedTicksMapping:
|
||||
"""같은 프로세스(부모)에서도 검증용으로 매핑 뷰를 얻는다."""
|
||||
"""같은 프로세스(부모)에서도 검증용으로 매핑 뷰를 얻는다(이름으로 재-attach)."""
|
||||
return SharedTicksMapping(self._meta)
|
||||
|
||||
def local_mapping(self) -> SharedTicksMapping:
|
||||
"""같은 프로세스(Optuna 단일프로세스/스레드)용 — 부모가 이미 연 버퍼를 그대로 재사용.
|
||||
|
||||
cross-process 용 ``attach_mapping`` 은 워커에서 ``SharedMemory(name=...)`` 로 다시
|
||||
attach 하지만, 같은 프로세스에서 그렇게 하면 resource_tracker 재등록/해제가 엇갈려
|
||||
종료 시 무해하지만 시끄러운 ``KeyError`` 노이즈가 난다. 여기서는 새 attach 없이
|
||||
생성자가 보관 중인 shm 버퍼로 numpy 배열을 직접 얹어(추가 attach 0회) 그 노이즈를
|
||||
원천 제거한다. 배열을 미리 연결하므로 스레드(n_jobs>1) 초기화 레이스도 없다.
|
||||
"""
|
||||
m = SharedTicksMapping(self._meta)
|
||||
total = int(self._meta["total"])
|
||||
src_dtype = self._meta["src_dtype"]
|
||||
m._price = np.ndarray((total,), dtype=_DT_PRICE, buffer=self._shms["price"].buf)
|
||||
m._volume = np.ndarray((total,), dtype=_DT_VOLUME, buffer=self._shms["volume"].buf)
|
||||
m._tick_time = np.ndarray((total,), dtype=_DT_TICKTIME, buffer=self._shms["tick_time"].buf)
|
||||
m._source = np.ndarray((total,), dtype=src_dtype, buffer=self._shms["source"].buf)
|
||||
m._epoch = np.ndarray((total,), dtype=_DT_EPOCH, buffer=self._shms["epoch"].buf)
|
||||
m._attached = True # 배열 이미 연결 → _ensure() no-op (재-attach 안 함)
|
||||
return m
|
||||
|
||||
|
||||
def build_shared_ticks(
|
||||
ticks_by_code: Optional[Dict[str, Dict[str, List[Dict[str, Any]]]]],
|
||||
@@ -446,9 +466,40 @@ def build_shared_ticks(
|
||||
return SharedTickStore(shms, meta)
|
||||
|
||||
|
||||
def build_shared_ticks_view(
|
||||
ticks_by_code: Optional[Dict[str, Dict[str, List[Dict[str, Any]]]]],
|
||||
*,
|
||||
enabled: bool = True,
|
||||
) -> Tuple[Any, Optional["SharedTickStore"]]:
|
||||
"""단일 프로세스(Optuna 등)용 — dict 를 컬럼 공유메모리 '뷰' 로 치환해 RAM 절감.
|
||||
|
||||
[Grid 와 차이]
|
||||
Grid 파라서치는 워커 '프로세스' 간 사본 제거가 목적이라 descriptor 를 워커로
|
||||
넘겨 attach 시킨다. Optuna 는 단일 프로세스(또는 n_jobs 스레드)라 사본 문제는
|
||||
없지만, dict-of-dict(파이썬 객체 오버헤드 큼)을 numpy 컬럼(shared_memory)으로
|
||||
바꾸면 **메모리 사용량**이 크게 준다 → RAM 이 적은 WSL 에서도 대용량 틱으로
|
||||
Optuna 를 돌릴 수 있다.
|
||||
|
||||
반환 ``(view, store)``:
|
||||
· 성공: ``(SharedTicksMapping, SharedTickStore)`` — 종료 시 ``store.unlink()`` 필수
|
||||
· 미지원/빈데이터/off/실패: ``(원본 ticks_by_code, None)`` — 호출부가 dict 경로 그대로 사용
|
||||
|
||||
``SharedTicksMapping`` 은 원본 dict 와 bit-identical(Grid E2E 검증) 이라 evaluate 무변경.
|
||||
"""
|
||||
if not enabled or not ticks_by_code or not shared_ticks_available():
|
||||
return ticks_by_code, None
|
||||
store = build_shared_ticks(ticks_by_code)
|
||||
if store is None:
|
||||
return ticks_by_code, None
|
||||
# 단일 프로세스용 로컬 매핑 — 부모 버퍼 재사용(추가 attach 0회) → 종료 noise 없음 + 스레드 안전.
|
||||
view = store.local_mapping()
|
||||
return view, store
|
||||
|
||||
|
||||
__all__ = [
|
||||
"shared_ticks_available",
|
||||
"build_shared_ticks",
|
||||
"build_shared_ticks_view",
|
||||
"SharedTickStore",
|
||||
"SharedTicksMapping",
|
||||
"SharedBucketMapping",
|
||||
|
||||
Reference in New Issue
Block a user