Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## 2024-07-04 - R 언어에서 루프 내 데이터 프레임 탐색 병목 최적화
**Learning:** R에서 루프를 돌면서 매번 데이터 프레임을 서브셋팅(subsetting)하는 작업은 복사 오버헤드로 인해 매우 느려질 수 있습니다. 특히 공통 문항 수가 많아질 경우 O(N^2)의 비효율을 초래합니다.
**Action:** 루프 내에서 수행하던 데이터 프레임 조회를 루프 외부에서 한 번에 `as.character(unlist(...))`로 처리하는 벡터 연산으로 변경하여 타입 변환 없이 O(1) 수준으로 성능을 크게 향상시킬 수 있습니다.
## 2024-07-08 - R 언어에서 다중 패턴 제외 필터링 성능 최적화
**Learning:** R에서 여러 `grep()` 결과를 `-c()`로 합쳐서 벡터의 원소를 제외하는 로직(`x[-c(grep(pattern1), grep(pattern2))]`)은 여러 번의 문자열 검색과 인덱스 배열 생성으로 인해 오버헤드가 발생하며, 매칭되는 패턴이 없을 경우 `integer(0)`을 반환하여 전체 벡터가 삭제되는 버그를 유발할 수 있습니다.
**Action:** 여러 `grep` 조건을 하나의 정규 표현식으로 묶어 `!grepl("^(pattern1|pattern2)", x)` 형태로 사용하는 것이 성능 면에서 유리하며, 결과가 없을 때의 안전성도 확보됩니다.
10 changes: 1 addition & 9 deletions R/aFIPC.R
Original file line number Diff line number Diff line change
Expand Up @@ -603,15 +603,7 @@ autoFIPC <-
# IPD estimation
IPDParmNames <- OldScaleParms$name
IPDParmNames <- IPDParmNames[!duplicated(IPDParmNames)]
IPDParmNames <-
IPDParmNames[
-c(
grep("^MEAN", IPDParmNames),
grep("^COV", IPDParmNames),
grep("^ak", IPDParmNames),
grep("^d0$", IPDParmNames)
)
]
IPDParmNames <- IPDParmNames[!grepl("^(MEAN|COV|ak|d0$)", IPDParmNames)]
IPDParmNames <- as.character(IPDParmNames)

mirt::mirtCluster()
Expand Down
Loading