Perl5 데이터 과학 언어
시리즈 소개 — N의 포스트 0
이 게시물은 Perl5 + PDL로 작성 된 벡터 데이터베이스 엔진 (VDBE)의 공동 개발을 문서화 한 시리즈의 첫 번째 게시물입니다. 나중에 포스트는 그 엔진의 각 성분을 통해 걷습니다; 이것은 무대를 놓습니다. 이 시리즈의 주요 자극은 내가 성능 주장을하지로 VDBE를 덤프하는 것이 아니라 다른 언어로 달성 할 수있는 거의 모든 것을 달성하기 위해 Perl을 사용하는 방법을 보여주는 것입니다, 그러나 더 똑똑한!
1. 왜 Perl5 데이터 과학?
데이터 과학자가 언어 선택에 대해 논의 할 때 대화는 파이썬, R 또는 줄리아에서 빠르게 수렴됩니다. Perl5 테이블에 좌석을 거의 얻지 못하지만 두 번째 모양이 필요한 매력적인 특성 세트가 있습니다. 이러한 특성은 수년 동안 실질적으로 변하지 않았습니다 (Perl5는 항상 이런 식으로되었습니다!). 언어에 노출되어 자사의 강인함, 합리성, 유연성, 표현 가능성을 평가하는 법을 배웠고 실제로 작업을 진행하는 데 사용한 경우가 아니라면 이러한 기능이 Perl5에서 무료로 제공 될뿐만 아니라 프로젝트를 진행하는 데 도움이 될 수 있음을 알 수 있습니다..
유비쿼티 및 제로 설치 배포
Perl5는 리눅스 배포판, macOS, BSD 및 많은 임베디드 리눅스 환경 등 거의 모든 UNIX와 유사한 운영 체제의 기본 구성 요소로 제공됩니다. perl 상자 밖으로 바이너리. 파이썬은 여기에서 도로를 만들고 있지만 Perl이 있고 전체 파이썬 스택이없는 헤드리스 서버, 네트워크 어플라이언스 또는 HPC 로그인 노드를 찾는 것이 여전히 일반적입니다. Perl로 작성된 데이터 파이프라인은 conda 환경, venv또는 컨테이너입니다.
데이터 센터에서 에지로의 이식성
256코어 HPC 노드에서 테라바이트 데이터 세트를 분석하는 것과 동일한 스크립트는 사소한 구성 변경으로 라즈베리 파이, IoT 게이트웨이 또는 내장 컨트롤러에서 실행할 수 있습니다. Perl의 단일 바이너리 배포 모델과 낮은 런타임 오버헤드를 통해 실제 구현 “한 번 쓰기, 어디서나 실행” 파이썬의 인터프리터 오버헤드 또는 줄리아의 JIT 워밍업 시간이 용납되지 않는 환경에서의 언어.
어디든 배포할 계획이라면 everywhere Perl5를 선택하는 것이 좋습니다.
텍스트 및 데이터 뭉치를 기반으로 구축된 유산
Perl은 처음부터 텍스트 처리, 정규 표현식 및 “접착제” 시스템 구성 요소 간 작업 실제로 과학 데이터 파이프라인은 숫자 계산이 아니라 이기종 파일 형식 읽기, 지저분한 레코드 정리, 여러 소스의 데이터 세트 결합, 다운스트림 소비 구성 요소로 결과 라우팅 등 data wrangling에 의해 지배됩니다.
Perl의 정규식 엔진은 사용 가능한 가장 강력한 엔진 중 하나이며, 단일 라이너는 다른 언어의 도우미 라이브러리가 필요한 데이터 정리 작업을 수행할 수 있습니다.
과학 컴퓨팅 분야에 있다면 워크플로 관리 시스템 및 *재현 가능한 연구 *의 개념을 발견했을 수 있습니다. 이들은 모두 엔드투엔드 데이터 변환 및 워크플로의 실행을 통해 오류가 발생하기 쉽고 지루한 수동 작업을 없애고 분석가와 과학자가 데이터를 인사이트 및 추론으로 각각 모핑하기 위해 수행해야 하는 클릭 활동을 수행합니다.
이 용감한 새로운 세계에서 Perl5의 풍부한 역사를 통해 워크플로우의 구성 요소 또는 이러한 워크플로우를 구현하는 응용 프로그램 언어로 빛날 수 있습니다.
CPAN: 전투 테스트 모듈 에코시스템
CPAN(Comprehensive Perl Archive Network)은 상상할 수 있는 모든 도메인에서 200,000개 이상의 모듈을 호스트합니다. 데이터 과학 오퍼링은 파이썬만큼 광범위하지는 않지만 전용 빌더를위한 기본 구성 요소는 다음과 같습니다.
PDL(Perl Data Language) — 강력하게 입력된 N차원 배열(아래 깊이 있음)이 있는 벡터화된 숫자 컴퓨팅입니다.
PDL::Stats — PDL 배열 위에 구축된 설명 통계, 회귀, 클러스터링(k-평균, 미니 배치 k-평균) 등
AI::MXNet, AI::TensorFlow — 딥 러닝 바인딩입니다.
Statistics::Regression, Statistics::Descriptive — PDL 종속성이 없는 클래식 통계입니다.
텍스트::CSV, 스프레드시트::XLSX, 데이터::MessagePack, 시리얼 — 고성능 직렬화 및 I/O.
DBI + 수십 개의 데이터베이스 드라이버 - 모든 주요 RDBMS에 대한 SQL 액세스입니다.
MCE(다중 코어 엔진) — 공유 및 분산 메모리 워크로드를 위한 구조화된 병렬 처리.
Inline::C, Inline::CPP — Perl 소스 파일 내에 직접 C 또는 C++ 코드를 포함합니다. 컴파일러는 스크립트가 처음 실행될 때 투명하게 호출되므로 전체 XS 빌드 시스템 없이 성능에 중요한 커널을 다른 순수 펄 프로그램으로 떨어뜨리는 것이 사소합니다.
FFI::Platypus — 모든 공유 라이브러리에서 함수를 호출합니다(
.so/.dylib/.dll) XS 또는 C 접착제 코드의 단일 라인을 작성하지 않고 펄에서. Platypus는 모든 C 등가 유형, 구조, 콜백 및 폐쇄를 지원하며 Perl을 BLAS, LAPACK, HDF5 또는 기타 네이티브 라이브러리에 바인딩하는 최신 방법입니다.
현대 펄은 할아버지의 펄이 아닙니다.
아래 기능은 공식 릴리스 노트(perl5360delta, perl5380delta, perl5400delta) 및 안정성 상태에 도달했거나 처음 도입된 릴리스에 의해 구성됩니다. 데이터 과학 및 과학 컴퓨팅 워크로드와 관련된 기능만 강조 표시됩니다.
펄 5.36 — 2022년 5월
use v5.36— 이제 기능 번들이 자동으로 사용으로 설정됩니다.use warnings추가use strict. 또한indirectmethod-call 구문 및multidimensional해시 키 시뮬레이션을 통해 미묘한 버그에 대한 두 가지 공통 소스를 제거합니다.이름이 지정된 서브루틴 서명 (5.36 이후 안정적, 5.20 이후 실험적) — 이제 함수 매개변수가 이름으로 선언됩니다(선택적 기본값). 해당
//=및||=기본값 연산자는 5.38의 서명에 추가되어 트리거되는 기본값을 허용합니다.undef또는 각각 거짓:
use v5.36;
sub clamp ($val, $lo = 0, $hi //= 1) {
$val < $lo ? $lo : $val > $hi ? $hi : $val;
}
isa클래스 인스턴스 연산자 (5.36 이후 안정적; 5.32에서 도입) —$obj isa "ClassName"부울을 반환합니다. 보다 깨끗합니다.ref($obj) eq "ClassName".builtinmodule (stable since 5.40; experimental since 5.36) — 통역에 직접 내장된 렉시로 임포트 가능한 함수입니다. 안정적인 5.40 번들에는 다음이 포함됩니다.ceil,floor— 정수 반올림use POSIX.trim— 문자열에서 선행/후행 공백을 제거합니다.indexed— 각 요소를 해당 인덱스와 쌍을 이룹니다.for(아래 참조)true,false,is_bool— 타자형 부울 감성; serialisers는 이제 JSON을 방출할 수 있습니다true/false보다1/0.weaken,unweaken,is_weak— 메모리 누수 없이 양방향 데이터 구조를 구축하기 위한 참조 카운트 제어blessed,reftype,refaddr— 참조 검사입니다.
안정 부울 추적 (5.36) — 부울로 생성된 스칼라(예:
!!1) 이제 할당을 통해 부울 특성을 유지하여 JSON 및 MessagePack에 대한 신뢰할 수 있는 유형 인식 직렬화를 가능하게 합니다.다중 값
for루프 (5.40 이후 안정적; 5.36 이후 실험적) 수동 인덱스 산술 없이 쌍 또는 N-튜플을 반복합니다.
use v5.40;
use builtin 'indexed';
for my ($i, $val) (indexed @scores) { ... } # index and value
또는 동시에 여러 값 확보
use v5.40;
for my ($val1, $val2, $val3) (@scores) { ... }
deferblocks (experimental since 5.36) — 블록이 종료될 때, 정상적으로 또는 예외를 통해 클린업 코드를 무조건 실행하는 범위 종료 가드로서, 파괴자 기반 스코프 가드 객체를 자연스럽게 대체하고 데이터 파이프라인에서 리소스 관리를 위한 중요한 패턴입니다.
펄 5.38 — 2023년 7월
PERL_RAND_SEED환경 변수 (5.38) — 실행 전에 이 변수를 설정하면rand호출(명시적이지 않음)srand)는 소스 코드를 수정하지 않고 시뮬레이션, 무작위 샘플링, 몬테카를로 메소드 등의 확률적 알고리즘을 재생할 수 있는 동일한 시퀀스를 생성합니다.class/field/methodsyntax (experimental since 5.38) — 특별히 제작된 어휘 범위가 지정된 객체 시스템입니다.bless아니요@ISACPAN 모듈도 없습니다. 데이터 집합 행, 모델 매개변수 또는 파이프라인 단계와 같은 형식화된 값 객체를 정의하는 데 유용합니다.
use feature 'class';
no warnings 'experimental::class';
class Vector2D {
field $x :param;
field $y :param;
method magnitude { sqrt($x**2 + $y**2) }
}
my $v = Vector2D->new(x => 3, y => 4);
say $v->magnitude; # 5
펄 5.40 — 2024년 6월
try/catch예외 취급 (5.40부터 안정되어 있는; 5.34부터 실험;finallyblock added in 5.36) — 구조화된 예외 처리는 이제 핵심 언어 기능입니다. CPAN 모듈은 필요하지 않습니다.
use v5.40;
try {
my $result = load_and_process($file);
}
catch ($e) {
warn "Pipeline error: $e";
}
finally {
close_resources(); # runs whether or not an exception was thrown
}
(Try::Tiny / Feature::Compat::Try 5.34보다 오래된 펄을 타겟팅할 때만 필요합니다.)
다중 값
forloops (stable since 5.40) — 위의 5.36 엔트리를 참조하십시오; 그들은이 릴리스에서 실험에서 안정적으로 졸업했습니다.builtin::inf및builtin::nan(5.40 이후 실험적) — 부동 소수점 무한대 및 숫자가 아닌 상수 입력, 제거9**9**9또는 숫자 코드의 POSIX 해킹.^^논리 XOR 연산자 (5.40) — 중간 우선 논리 연산자 세트(&&,||,^^); 부울 마스크 작업에 편리합니다.use v5.40내장 함수 임포트 — 기능 번들을 사용으로 설정하는 것 이상으로,use v5.40또한 해당builtin버전 번들, 모두 안정화builtin::별도의 이름 없이 짧은 이름으로 사용할 수 있는 함수use builtin명령문
오랜 기능(5.36 이전)
say및state(5.10 이후) —say다음과 같음print암시적 줄바꿈으로;state닫는 하위의 호출에 걸쳐 지속되는 렉시칼을 선언합니다(경량 메모화 기본 데이터).일류 참조 및 폐쇄 — 익명의 하위, 폐쇄 및 참조 구성은 근본적이며 Perl 5 이후 안정적이었습니다.
use constant또는 CPANReadonly명명된 상수를 위한 모듈;Readonly깊은 불변성을 적용하여use constant그렇지 않습니다.
다음과 결합됨 perlbrew 또는 plenv 버전 관리 및 carton 재현 가능한 종속성 스냅샷을 위해 최신 Perl 프로젝트는 일류 소프트웨어 엔지니어링 작업처럼 보입니다.
정직한 한계
No case for Perl is complete without honesty about where it falls short:
시각화 — 펄은 다음과 같지 않습니다.
ggplot2또는matplotlib. 플롯은 일반적으로 R, gnuplot 또는 웹 라이브러리에 대한 외부 호출이 필요합니다. 때때로이 약점은 실제 강점이 될 수 있으므로 다른 배우를 조율하고 향상시키는 응용 프로그램 언어로 Perl5를 사용할 수 있습니다.커뮤니티 모멘텀 — 데이터 과학 커뮤니티가 파이썬과 R로 융합되었습니다. 준비된 자습서, Stack Overflow 답변 및 공동 작성자를 찾는 것이 더 어렵습니다.
객체 방향 — Moose/Moo가 없으면 OOP 모델이 상세하게 표시됩니다. OOP 모델은 종속성을 추가합니다. 새로운
class기능으로 인해 이러한 문제가 해결될 수 있습니다.대규모의 안전 유형 — 핵심 언어의 동적 스칼라는 대규모의 협업 숫자 코드베이스를 추론하기 어렵게 만듭니다(다음 섹션 참조).
2. Perl 데이터 유형 시스템 — 강점 및 캐시 시대 제한
코어 펄 유형
Perl의 기본 데이터 모델 센터는 다음 세 가지 구성으로 구성됩니다.
| 건설 | Sigil | 그것이 가지고있는 것 |
|---|---|---|
** 스칼라** $ |
단일 값: 숫자, 문자열, 참조 또는 undef |
|
** 어레이** @ |
정수로 인덱스화된 스칼라 정렬된 리스트 | |
| Hash | % |
문자열로 키 지정된 스칼라 값의 정렬되지 않은 모음 |
객체, 폐쇄, 복잡한 데이터 구조 등 다른 모든 것은 참조를 통해 이 세 가지 기본 데이터 유형에서 구축됩니다(\@array, \%hash, sub { ... }).
이 모델은 매우 유연합니다. 단일 배열은 정수, 부동 소수점 수, 문자열 및 중첩 참조를 동시에 보유할 수 있습니다. 이러한 유연성은 Perl을 20년 동안 지배적인 시스템 관리 및 웹 스크립팅 언어로 만든 것입니다.
캐시 계층 문제
최신 CPU는 데이터가 L1/L2/L3 캐시를 통과하는 경우에만 최대 처리량을 달성합니다.† 크고 연속적인 블록 — spatial locality라는 속성 펄 어레이는 이것을 제공하지 않습니다. 후드 아래에서 Perl 배열은 힙 할당 스칼라(SV) 구조 각 스칼라에는 참조 수, 유형 태그 및 패딩(일반적으로 64비트 빌드에서 스칼라당 24–56바이트)이 포함됩니다. 따라서 백만 개 이상의 요소 펄 어레이를 반복하면 힙에 흩어져 있는 백만 개의 포인터 참조가 해제되어 최신 SIMD 파이프라인의 속도 이점을 완전히 부정하는 캐시 누락 패턴이 생성됩니다.
A concrete consequence: 순수 펄로 작성된 두 개의 1개의 000 요소 벡터의 도트 제품은 L1 캐시에 편안하게 맞는 4개의 000바이트 메모리 영역을 차지하는 PDL 플로트 ndarrays 쌍의 동등한 작업보다 약 100–1000× 느립니다입니다.
R과 대조
R은 호기심 많은 중간 지점을 차지합니다. Perl과 마찬가지로 변수는 입력되지 않은 컨테이너이고 함수는 일류 값이며 대화식 REPL은 기본 개발 환경입니다. R은 Perl의 세 가지 핵심 유형과 직접 유사합니다.
R Analogue의 발음을 R Analogue [en]
|—|—|
| $scalar 길이-1 원자 벡터 또는 스칼라-인-리스트 |
| @array | list() |
| %hash | 이름 지정됨 list() |
| 참조(\@arr) | R은 명시적 참조를 사용하지 않습니다. 대신 수정 시 의미를 복사합니다.
그러나 R의 workhorse 유형, 즉 원자 벡터에는 간단한 Perl이 없습니다. R 원자 벡터는 CPU 캐시가 보상하는 레이아웃과 동일하게 입력된 연속적인 메모리 블록입니다. R에 있는 각 붙박이 스칼라는 실제로 길이 1 원자 벡터입니다; 거기 없습니다 “베어 스칼라” Atomic Vectors 근처 오락거리
이 설계 선택은 사용자가 단일 루프를 작성하거나 특수 루프를 할당하지 않고도 BLAS 레벨 처리량으로 수백만 개의 이중 벡터에서 R 코드가 자연스럽게 작동한다는 것을 의미합니다. “배열” 객체를 생성합니다.
R의 원자 유형은 다음과 같습니다.
| R 원자 유형 | 스토리지 | C 등가 |
|---|---|---|
logical 4 바이트/요소 int (NA Sentinel 포함) |
||
integer 4 바이트/요소 int32_t |
||
double 8 바이트/요소 double |
||
complex 16 바이트/요소 _Complex double |
||
character CHARSXP 소개 char * (인턴) |
||
raw 1 byte/element 입니다. uint8_t |
R also defines higher-level structures built on atomic vectors:
- 매트릭스 — 2D 원자 벡터
dim속성. - array — N-D 원자 벡터
dim속성. - data.frame — 동일한 길이의 원자 벡터의 명명된 목록; 링구아 프랑카
R의 테이블 형식 데이터입니다. - factor — a를 가진 정수 벡터
levels속성; 범주 데이터를 인코딩합니다.
The lesson: 통계 및 데이터 과학 애플리케이션에서 사용되는 R의 컴퓨팅 성능은 연속적인 원자 벡터에서 직접 흐릅니다. 성능에 대한 Perl의 동등한 경로는 확장입니다(또한 독립형임). matlab 환경과 유사), 펄 데이터 언어 PDL.
3. PDL 입력: 강력하게 입력된 N차원 배열
Perl Data Language(PDL, pdl.perl.orgndarrays(N차원 배열)를 사용하여 Perl을 확장합니다. 퍼스트 클래스 Perl 객체처럼 보이고 느껴지는 연속적이고 강력하게 입력된 메모리 버퍼입니다.
use PDL;
# A 1-D float ndarray — 4 bytes × 5 elements in one contiguous block
my $v = float( 1.0, 2.0, 3.0, 4.0, 5.0 );
# A 128-dimensional random database of 1000 vectors — all in cache-friendly memory
my $db = random( 128, 1000 ); # double by default
# Dot product of every DB vector against a query — a single BLAS call
my $scores = $db x $query->transpose;
PDL 기본 유형
PDL exposes the full palette of C numeric types as first-class constructors:
| PDL 유형 | 바이트 | C 유형 | 생성자 |
|---|---|---|---|
byte |
1 | uint8_t |
byte(...) |
short |
2 | int16_t |
short(...) |
ushort |
2 | uint16_t |
ushort(...) |
long |
4 | int32_t |
long(...) |
indx 4 또는 8 ssize_t |
indx(...) |
||
longlong 8 |
int64_t |
longlong(...) |
|
float |
4 | float |
float(...) |
double 8 |
double |
double(...) |
|
cfloat 8 |
_Complex float |
cfloat(...) |
|
cdouble 16 |
_Complex double |
cdouble(...) |
스레딩 및 SIMD
PDL의 가장 독특한 기능 중 하나는 *암시적 스레딩 *입니다. 작업은 추가 차원을 통해 자동으로 브로드캐스트되므로 사용자 코드에서 명시적 루프를 제거하고 내부 루프를 최적화된 C 또는 Fortran 커널에 위임할 수 있습니다. 다음과 결합됨 set_autopthread_targ(N), PDL은 서로 독립적인 슬라이스를 자동으로 병렬화합니다. N OS 스레드 — 사용자가 단일 fork 또는 Thread::Queue 통화
잘못된 값
PDL에는 잘못된 값(PDL::Bad), R에 직접 유사 NA. ndarray는 “잘못된 값 인식”및 PDL 작업은 산술, 통계 및 I/O를 통해 배지를 올바르게 전달합니다.
4. 유형 비교: 펄, PDL 및 R 나란히
아래 표는 일반적으로 사용되는 모든 R 유형을 가장 가까운 Perl 및 PDL에 매핑하여 세 언어가 서로 동의, 차이 또는 보완되는 위치를 강조 표시합니다.
| |
|—|—|—|—|
주요 요점
순수한 숫자, 동종 데이터(벡터, 매트릭스, 텐서)의 경우 PDL 배열 및 R 원자 벡터는 기능적으로 동등하며 비교적 효율적입니다.
이기종 표 형식 데이터(혼합 유형, 문자열 열, 계수)의 경우 R
data.frame보다 인체 공학적임. Perl은 일반적으로 배열의 해시 또는 다음과 같은 전용 모듈을 사용합니다.Data::Frame또는PDL::IO::CSV.텍스트, 불규칙한 구조, 시스템 접착제의 경우, 펄의 네이티브 타입은 R과 파이썬 둘 다보다 뛰어납니다.
따라서 Perl+PDL 조합은 R이 통계 언어로 제공하는 것과 Perl이 시스템 언어로 제공하는 것의 union을 제공합니다 - 더 가파른 학습 곡선의 비용과 덜 즉시 사용 가능한 통계적 툴링.
그러나 Perl+PDL+R의 조합(후자는 구성요소로 사용됨) 도구화됨 Perl을 통해)
5. 로드맵: 이 시리즈의 나머지 부분이 다루는 내용
이 시리즈는 처음부터 Perl5 + PDL에 내장된 벡터 데이터베이스 엔진의 구성을 문서화합니다. 벡터 데이터베이스는 최신 검색 증강 생성(RAG) 파이프라인, 의미 검색 및 가장 가까운 이웃 권장 시스템을 뒷받침합니다. 첫 번째 원칙에서 하나를 구현하는 것은 Perl의 시스템 프로그래밍 강점과 함께 PDL의 수치 능력을 입증하기위한 훌륭한 수단입니다.
이러한 게시물과 함께 공동 개발 된 디렉토리는 다음 구성 요소를 포함하며, 각 구성 요소는 전용 저장소의 파일을 참조하는 하나 이상의 전용 게시물의 주제가됩니다.
Post 1 — 직렬화 및 I/O: VectorIO 모듈
파일: VectorIO.pm
엔진은 벡터를 내부에 포장된 바이너리 블럽으로 저장합니다. MessagePack 페이로드. 이 게시물은 다음을 포함합니다.
- 클린으로 모듈 설계
Exporter기반 공용 APIuse v5.40. - 시스템 경계에서 스키마 정확성을 적용하는 검증 도우미입니다.
Post 2 — 벡터 데이터베이스 시뮬레이션
파일: simulate_vectorDB.pl
데이터베이스를 검색하려면 먼저 데이터베이스가 필요합니다. 이 게시물은 다음을 보여줍니다.
- 재생 가능한 임의 부동 벡터 생성
PDL::random. - 사용
GetOpt::Long인체 공학적 CLI 옵션 구문 분석 - 작성 a
--seed- 모든 실행에서 동일한 데이터베이스를 생성하는 제어 시뮬레이션 - 벤치마킹에 필수적입니다.
포스트 3 — 벤치마킹: The timing_DB 모듈
파일: timing_DB.pm
성과 청구에는 측정이 필요합니다. 이 게시물은 다음을 소개합니다.
- 재사용 가능한 펄 벤치마킹 하네스
Time::HiRes. - Perl/PDL 및 R 구현 간의 공정한 월-시계 비교 방법론.
- 다양한 워크로드 크기에 대해 처리량(벡터/초)과 대기 시간(밀리초/질의)을 해석합니다.
포스트 4 — K-평균 클러스터링 PDL::Stats::Kmeans
파일: kmeans.pl
K-평균 클러스터링은 대략적으로 가장 가까운 이웃 검색에 대한 역파일 인덱스(IVF) 접근 방식의 중추입니다. 이 게시물은 다음을 포함합니다.
- The
PDL::Stats::Kmeans인터페이스 및 반환 계약(centroid,cluster,n,R2,ss). - 해석
[obs × clusters]멤버쉽 마스크 반환자run_kmeans. - 펄/PDL k-평균 원심과 R의 원심 비교
kmeans()및ClusterR::MiniBatchKmeans()숫자 정확도를 검증합니다.
포스트 5 — 미니 배치 K-평균: 대형 데이터 세트로 확장
파일: compare_kmeans_centroids.pl
전체 k-평균은 모든 반복에 대해 메모리의 모든 데이터를 필요로 합니다. 미니 배치 k-평균은 메모리 및 컴퓨팅의 큰 감소를 위해 소량의 센트로이드 정확도를 거래합니다. 이 포스트는 탐구한다:
- PDL에서 실제 재샘플링된 미니 배치 루프 구현
- 전체 및 미니 배치 변형 사이의 중심 드리프트 정량화.
- R의 나란히 산출
MiniBatchKmeans에서ClusterR패키지
포스트 6 — 반전된 파일 인덱스(IVF) 검색
파일: compare_ivf_search.pl
중앙집중식으로 데이터베이스를 분할하고 대략적인 하위 선형 근사 이웃 검색을 수행할 수 있습니다. 이 게시물은 다음을 포함합니다.
- Building the inverted lists: 각 데이터베이스 벡터를 가장 가까운 중심으로 매핑합니다.
- The
unpack_inverted_lists도우미 위치VectorIO. - Querying: 가장 가까운 상위 K 중심점을 찾은 다음 해당 목록만 검색합니다.
- 프로브된 리스트의 수가 다르기 때문에 정확성 대 속도 상충.
포스트 7 — R에 대한 검증: 수치적 정확성 및 상호 언어 파이프라인
파일: compare_kmeans_centroids.R, compare_kmeans_centroids_pure.R, plot_centroid_coordinates.R
The final post in the foundation series closes the loop between Perl and R:
- PDL 결과를 CSV로 익스포트하고 독립 검증을 위해 R에서 읽습니다.
- ggplot2를 사용하여 두 언어의 중심 좌표를 동시에 시각화합니다.
- 워크플로우 패턴 “Perl에서 컴퓨팅, R에서 시각화” 그것은 두 생태계의 강점을 활용합니다.
Next up — Post 1: 직렬화 및 입출력
VectorIO.pm
† 최신 CPU에는 프로세서 코어와 기본 RAM 사이에 있는 캐시(L1, L2, L3)라는 여러 레벨의 빠른 온칩 메모리가 있습니다. L1는 가장 작은 크기(일반적으로 코어당 32–64KB)와 가장 빠른 속도(1–4시간 대기 시간)입니다. L2는 더 크고(256KB–1MB) 약간 느립니다. L3는 더 높은 대기 시간을 가진 코어 간 공유(4–64MB)입니다. 메인 RAM은 60-100 ns 대기 시간에 더 멀리 떨어져 있습니다. L1보다 약 200 × 느립니다.
계산이 예측 가능하고 연속적인 패턴의 메모리에 닿으면 하드웨어 prefetcher는 필요한 데이터를 L1/L2로 로드하여 거의 최고 처리량을 달성할 수 있습니다. 분산된 포인터 추적(예: 힙 할당 스칼라의 Perl 배열 순회)은 사전 인출을 물리치고, RAM에서 각 캐시 실패가 해결될 때까지 기다리는 동안 CPU를 정지합니다.