저는 파이썬 API가 카산드라와 같은 대형 데이터 저장소를 찾는 방법에 대해 생각하려고합니다. R, Matlab 및 NumPy는 "모든 것이 행렬입니다"공식을 사용하고 각 작업을 개별적으로 실행하는 경향이 있습니다. 이 모델은 메모리에 저장할 수있는 데이터에 효과적이라는 것을 입증했습니다. 그러나 큰 데이터에 대한 SAS의 이점 중 하나는 행별로 실행하여 다음 행으로 이동하기 전에 모든 행 계산을 수행한다는 것입니다. Cassandra와 같은 데이터 저장소의 경우이 모델은 거대한 승리처럼 보입니다. 데이터를 한 번만 반복합니다. 명시 적으로 이것은파이썬에서 큰 데이터를 지연 실행했습니다.
with load('datastore') as data:
for row in rows(data):
row.logincome = row.log(income)
row.rich = "Rich" if row.income > 100000 else "Poor"
하지만 한 번만 반복의 장점이있다 (도?) :
파이썬에서, SAS의 접근 방식은 같은 것을 볼 수 있습니다. 더 작은 데이터 세트의 경우, 함수가 컴파일 된 코드를 사용하여 벡터화되지 않기 때문에 성능이 NumPy에 비해 매우 열악합니다. R/NumPy와에서 우리는 훨씬 더 간결하고 컴파일을 할 것이다 : log
및 ifelse
그 벡터에 연산자를 모두 컴파일 된 함수이기 때문에
data.logincome = log(data.income)
data.rich = ifelse(data.income > 100000, "Rich", Poor")
이 매우 빠르게 실행됩니다. 그러나 단점은 두 번 반복된다는 것입니다. 작은 데이터 세트의 경우 이것은 중요하지 않지만 Cassandra 백업 데이터 저장소의 경우이 접근 방식이 어떻게 작동 하는지를 볼 수 없습니다.
질문 : 두 번째 API (예 : R/Numpy/Matlab)를 유지하는 방법이 있지만 계산 지연이 있습니다. 마지막에 sync (data) 함수를 호출하면 될까요?
다른 아이디어? NumPy 형식 구문을 유지하는 것이 좋을 것입니다. 사용자가 작은 작업에 NumPy를 사용하고 어떻게 작동하는지 직관적으로 파악할 수 있기 때문입니다.
나는 당신이하고있는 일을 완전히 잘하고 있는지 잘 모르겠습니다. 행이 기본 데이터에 대한 뷰인 행을 반복하는 첫 번째 옵션보다 어떻게 개선 될까요? – Tristan
음, 최상위 루프가 필요하다는 것을 확인합니다. 또 다른 한가지로, 여러분의 우려 중 하나는 루프 몸체와 별도의 함수에서 코드를 처리하는 것이라고 생각했습니다. (여러분은 "컴파일 된 함수"의 이점에 대해 이야기했는데, 이것이 파이썬에서 얼마나 많은 의미가 있는지 모르겠지만, 이러한 함수를 나중에 C 코드로 푸시 할 생각이라면 많은 의미가 있습니다). 세 번째 관심사는 처리 기능을위한 깔끔한 API였습니다. 이러한 제약 조건을 감안할 때 나는이 생산자 - 소비자 접근법이 좋은 타협이라고 생각했다. 그러나 YMMV. – ThomasH