Perl5 데이터 과학 언어
시리즈 소개 — N의 포스트 0
이 게시물은 Perl5 + PDL로 작성 된 벡터 데이터베이스 엔진 (VDBE)의 공동 개발을 문서화 한 시리즈의 첫 번째 게시물입니다. 나중에 포스트는 그 엔진의 각 성분을 통해 걷습니다; 이것은 무대를 놓습니다. 이 시리즈의 주요 자극은 내가 성능 주장을하지로 VDBE를 덤프하는 것이 아니라 다른 언어로 달성 할 수있는 거의 모든 것을 달성하기 위해 Perl을 사용하는 방법을 보여주는 것입니다, 그러나 더 똑똑한!
목차
1. 왜 Perl5 데이터 과학?
데이터 과학자가 언어 선택에 대해 논의 할 때 대화는 파이썬, R 또는 줄리아에서 빠르게 수렴됩니다. Perl5 테이블에 좌석을 거의 얻지 못하지만 두 번째 모양이 필요한 매력적인 특성 세트가 있습니다. 이러한 특성은 수년 동안 실질적으로 변경되지 않았습니다 (Perl5는 항상 이런 식으로되었습니다!), 그러나 당신은 언어에 노출되어 있으며, 그 자만심, 합리성, 유연성, 표현성을 이해하는 법을 배웠고, 실제로 그것을 사용하여 작업을 발전 시켰습니다., 이러한 기능은 Perl5에서 무료로 제공 될뿐만 아니라 프로젝트를 진행하는 데 도움이 될 수 있음을 알 수 있습니다.
유비쿼티 및 제로 설치 배포
Perl5는 리눅스 배포판, macOS, BSD 및 많은 임베디드 리눅스 환경 등 거의 모든 UNIX와 유사한 운영 체제의 기본 구성 요소로 제공됩니다. 펄 상자 밖으로 바이너리. 파이썬은 여기에서 도로를 만들고 있지만 헤드리스 서버, 네트워크 어플라이언스 또는 HPC 로그인 노드를 찾는 것이 여전히 일반적입니다.
여기서 펄은 존재하고 전체 파이썬 스택은 존재하지 않습니다. Perl로 작성된 데이터 파이프라인은 콘다 환경, 베네치아또는 컨테이너입니다.
데이터 센터에서 에지로의 이식성
256코어 HPC 노드에서 테라바이트 데이터 세트를 분석하는 것과 동일한 스크립트는 사소한 구성 변경으로 라즈베리 파이, IoT 게이트웨이 또는 내장 컨트롤러에서 실행할 수 있습니다. 펄’단일 바이너리 배포 모델과 낮은 런타임 오버헤드로 인해 실제 구현 “한 번 쓰기, 어디서나 실행” 파이썬이 있는 환경에서의 언어’인터프리터 오버헤드 또는 줄리아’JIT 워밍업 시간은 용납할 수 없습니다.
어디든 배포할 계획이라면 everywhere Perl5를 선택하는 것이 좋습니다.
텍스트 및 데이터 뭉치를 기반으로 구축된 유산
Perl은 처음부터 텍스트 처리, 정규 표현식 및 “접착제” 시스템 구성 요소 간 작업 실제로 과학 데이터 파이프라인은 숫자 계산이 아니라 이기종 파일 형식 읽기, 지저분한 레코드 정리, 여러 소스의 데이터 세트 결합, 다운스트림 소비 구성 요소로 결과 라우팅 등 data wrangling에 의해 지배됩니다.
펄’regex 엔진은 사용 가능한 가장 강력한 엔진 중 하나로 유지되며, 단일 라이너는 다른 언어의 도우미 라이브러리가 필요한 데이터 정리 작업을 수행할 수 있습니다.
과학 컴퓨팅 분야에 있다면 워크플로 관리 시스템 및 *재현 가능한 연구 *의 개념을 발견했을 수 있습니다. 이들은 모두 엔드투엔드 데이터 변환 및 워크플로의 실행을 통해 오류가 발생하기 쉽고 지루한 수동 작업을 없애고 분석가와 과학자가 데이터를 인사이트 및 추론으로 각각 모핑하기 위해 수행해야 하는 클릭 활동을 수행합니다.
이 용감한 새로운 세계에서, 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 또는 기타 네이티브 라이브러리에 바인딩하는 최신 방법입니다.
모던 펄은 할아버지가 아니다.’s 펄
아래 기능은 공식 릴리스 노트(perl5360delta, perl5380delta, perl5400delta) 및 안정성 상태에 도달했거나 처음 도입된 릴리스에 의해 구성됩니다. 데이터 과학 및 과학 컴퓨팅 워크로드와 관련된 기능만 강조 표시됩니다.
펄 5.36 — 2022년 5월
v5.36 사용— 이제 기능 번들이 자동으로 사용으로 설정됩니다.경고 사용추가엄격한 사용. 또한간접method-call 구문 및다차원해시 키 시뮬레이션을 통해 미묘한 버그에 대한 두 가지 공통 소스를 제거합니다.이름이 지정된 서브루틴 서명 (5.36 이후 안정적, 5.20 이후 실험적) — 이제 함수 매개변수가 이름으로 선언됩니다(선택적 기본값). 해당
//=및||=기본값 연산자는 5.38의 서명에 추가되어 트리거되는 기본값을 허용합니다.정의 해제또는 각각 거짓:
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".내장module (stable since 5.40; experimental since 5.36) — 통역에 직접 내장된 렉시로 임포트 가능한 함수입니다. 안정적인 5.40 번들 포함, 다른 사람 중:천장,바닥— 정수 반올림POSIX 사용.자르기— 문자열에서 선행/후행 공백을 제거합니다.인덱스화됨— 각 요소를 해당 인덱스와 쌍을 이룹니다.대상(아래 참조)참,거짓,is_bool— 타자형 부울 감성; serialisers는 이제 JSON을 방출할 수 있습니다참/거짓보다1/0.약함,약해지지 않음,is_weak— 메모리 누수 없이 양방향 데이터 구조를 구축하기 위한 참조 카운트 제어축복받은,reftype,재패드— 참조 검사입니다.
안정 부울 추적 (5.36) — 부울로 생성된 스칼라(예:
!!1) 이제 할당을 통해 부울 특성을 유지하여 JSON 및 MessagePack에 대한 신뢰할 수 있는 유형 인식 직렬화를 가능하게 합니다.다중 값
대상루프 (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) { ... }
지연blocks (experimental since 5.36) — 블록이 종료될 때, 정상적으로 또는 예외를 통해 클린업 코드를 무조건 실행하는 범위 종료 가드로서, 파괴자 기반 스코프 가드 객체를 자연스럽게 대체하고 데이터 파이프라인에서 리소스 관리를 위한 중요한 패턴입니다.
펄 5.38 — 2023년 7월
PERL_RAND_SEED환경 변수 (5.38) — 실행 전에 이 변수를 설정하면랜드호출(명시적이지 않음)스란트)는 소스 코드를 수정하지 않고 시뮬레이션, 무작위 샘플링, 몬테카를로 메소드 등의 확률적 알고리즘을 재생할 수 있는 동일한 시퀀스를 생성합니다.클래스/필드/메서드syntax (experimental since 5.38) — 특별히 제작된 어휘 범위가 지정된 객체 시스템입니다.축복아니요@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월
시도/잡기예외 취급 (5.40부터 안정되어 있는; 5.34부터 실험;드디어block 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
}
(시험::작은 / 특징::Compat::시도 5.34보다 오래된 펄을 타겟팅할 때만 필요합니다.)
다중 값
대상loops (stable since 5.40) — 위의 5.36 엔트리를 참조하십시오; 그들은이 릴리스에서 실험에서 안정적으로 졸업했습니다.붙박이::inf및건축::남(5.40 이후 실험적) — 부동 소수점 무한대 및 숫자가 아닌 상수 입력, 제거9**9**9또는 숫자 코드의 POSIX 해킹.^^논리 XOR 연산자 (5.40) — 중간 우선 논리 연산자 세트(&&,||,^^); 부울 마스크 작업에 편리합니다.v5.40 사용내장 함수 임포트 — 기능 번들을 사용으로 설정하는 것 이상으로,v5.40 사용또한 해당내장버전 번들, 모두 안정화기능::별도의 이름 없이 짧은 이름으로 사용할 수 있는 함수내장 사용명령문
오랜 기능(5.36 이전)
말하다및상태(5.10 이후) —말하다다음과 같음인쇄암시적 줄바꿈으로;상태닫는 하위의 호출에 걸쳐 지속되는 렉시칼을 선언합니다(경량 메모화 기본 데이터).일류 참조 및 폐쇄 — 익명의 하위, 폐쇄 및 참조 구성은 근본적이며 Perl 5 이후 안정적이었습니다.
상수 사용또는 CPAN읽기 전용명명된 상수를 위한 모듈;읽기 전용깊은 불변성을 적용하여상수 사용그렇지 않습니다.
다음과 결합됨 펄브루 또는 플렌프 버전 관리 및 카톤 재현 가능한 종속성 스냅샷을 위해 최신 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 모델은 종속성을 추가합니다. 새로운
클래스기능으로 인해 이러한 문제가 해결될 수 있습니다.대규모의 유형 안전 — 핵심 언어’동적 스칼라는 대규모의 협업 숫자 코드베이스를 추론하기 어렵게 만듭니다(다음 섹션 참조).
2. Perl 데이터 유형 시스템 — 강점 및 캐시 시대 제한
코어 펄 유형
펄’세 가지 구성의 기본 데이터 모델 센터:
시길(Sigil) - What It Holds |
|———–|——-|—————|
** 스칼라** $ | 단일 값: 숫자, 문자열, 참조 또는 정의 해제 |
** 어레이** @ | 정수로 인덱스화된 정렬된 스칼라 목록 |
Hash | % | 문자열별로 입력된 스칼라 값의 정렬되지 않은 모음 |
객체, 폐쇄, 복잡한 데이터 구조 등 다른 모든 것은 참조를 통해 이 세 가지 기본 데이터 유형에서 구축됩니다(\@array, \%해시, 하위 { ... }).
이 모델은 매우 유연합니다. 단일 배열은 정수, 부동 소수점 수, 문자열 및 중첩 참조를 동시에 보유할 수 있습니다. 이러한 유연성은 Perl을 20년 동안 지배적인 시스템 관리 및 웹 스크립팅 언어로 만든 것입니다.
캐시 계층 문제
최신 CPU는 데이터가 L1/L2/L3 캐시를 통과하는 경우에만 최대 처리량을 달성합니다.† 크고 연속적인 블록 — spatial locality라는 속성 펄 어레이는 이것을 제공하지 않습니다. 후드 아래에서 Perl 배열은 힙 할당 스칼라(SV) 구조 각 스칼라에는 참조 수, 유형 태그 및 패딩(일반적으로 64비트 빌드에서 스칼라당 24–56바이트)이 포함됩니다. 따라서 백만 개 이상의 요소 펄 어레이를 반복하면 힙에 흩어져 있는 백만 개의 포인터 참조가 해제되어 최신 SIMD 파이프라인의 속도 이점을 완전히 부정하는 캐시 누락 패턴이 생성됩니다.
구체적인 결과 : 순수한 펄로 작성된 두 개의 1 000 요소 벡터의 점 제품은 L1 캐시에 편안하게 맞는 두 개의 플랫 4 000 바이트 메모리 영역을 차지하는 PDL 플로트 ndarrays 쌍의 동등한 작업보다 약 **100-1000 × 느립니다.
R과 대조
R은 호기심 많은 중간 지점을 차지합니다. Perl과 마찬가지로 변수는 입력되지 않은 컨테이너이고 함수는 일류 값이며 대화식 REPL은 기본 개발 환경입니다. R은 Perl에 대한 직접적인 유사성을 가지고 있습니다.’세 가지 핵심 유형:
| 펄 컨셉 | R 아날로그 |
|---|---|
$스칼라 |
length-1 원자 벡터 또는 스칼라 인 리스트 |
@array |
list() |
%해시 |
이름 지정됨 list() |
참조(\@arr) |
R은 명시적 참조를 사용하지 않습니다. 대신 수정 시 의미를 복사합니다. |
하지만 R’s workhorse 유형, 즉 원자 벡터에는 간단한 Perl이 없습니다. R 원자 벡터는 CPU 캐시가 보상하는 레이아웃과 동일하게 입력된 연속적인 메모리 블록입니다. R에 있는 각 붙박이 스칼라는 실제로 길이 1 원자 벡터입니다; 거기 없습니다 “베어 스칼라” Atomic Vectors 근처 오락거리
이 설계 선택은 사용자가 단일 루프를 작성하거나 특수 루프를 할당하지 않고도 BLAS 레벨 처리량으로 수백만 개의 이중 벡터에서 R 코드가 자연스럽게 작동한다는 것을 의미합니다. “배열” 객체를 생성합니다.
R’원자 유형은:
| R 원자 유형 | 스토리지 | C 등가 |
|---|---|---|
논리적 4 바이트/요소 정수 (NA Sentinel 포함) |
||
정수 4 바이트/요소 int32_t |
||
더블 8 바이트/요소 더블 |
||
복잡함 16 바이트/요소 복합 이중(_C) |
||
문자 CHARSXP 소개 문자 * (인턴됨) |
||
원시 1 byte/element 입니다. uint8_t |
또한 R은 원자 벡터에 구축된 상위 레벨 구조를 정의합니다.:
- 매트릭스 — 2D 원자 벡터
흐림속성. - array — N-D 원자 벡터
흐림속성. - data.frame — 동일한 길이의 원자 벡터의 명명된 목록; 링구아 프랑카
R의 테이블 형식 데이터입니다. - factor — a를 가진 정수 벡터
레벨속성; 범주 데이터를 인코딩합니다.
레슨: R’통계 및 데이터 과학 응용 프로그램에서 사용되는 컴퓨팅 성능은 연속적인 원자 벡터에서 직접 흐릅니다. 펄’성능에 해당하는 경로는 확장(독립형)입니다. 매트랩 환경과 유사), 펄 데이터 언어 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은 C 숫자 유형의 전체 팔레트를 일류 생성자로 표시합니다.:
| PDL 유형 | 바이트 | C 유형 | 생성자 |
|---|---|---|---|
바이트 |
1 | uint8_t |
바이트(...) |
짧음 |
2 | int16_t |
짧은(...) |
ushort |
2 | uint16_t |
ushort(...) |
길게 |
4 | int32_t |
long(...) |
인덱스 4 또는 8 ssize_t |
indx(...) |
||
긴 8 |
int64_t |
longlong(...) |
|
부동 |
4 | 부동 |
float(...) |
더블 8 |
더블 |
더블(...) |
|
플로트 8 |
복합 여유(_C) |
cfloat(...) |
|
더블 16 |
복합 이중(_C) |
cdouble(...) |
스레딩 및 SIMD
PDL 중 하나’s 가장 뚜렷한 기능은 암시적 스레딩입니다. 작업은 추가 차원을 통해 자동으로 브로드캐스트되므로 사용자 코드에서 명시적 루프를 제거하고 내부 루프를 최적화된 C 또는 Fortran 커널에 위임할 수 있습니다. 다음과 결합됨 set_autopthread_targ(N), PDL은 서로 독립적인 슬라이스를 자동으로 병렬화합니다. N개 OS 스레드 — 사용자가 단일 포크 또는 스레드::대기열 통화
잘못된 값
PDL에는 잘못된 값(PDL::나쁜), R에 직접 유사’초 해당 사항 없음. ndarray는 “잘못된 값 인식”및 PDL 작업은 산술, 통계 및 I/O를 통해 배지를 올바르게 전달합니다.
4. 유형 비교: 펄, PDL 및 R 나란히
아래 표는 일반적으로 사용되는 모든 R 유형을 가장 가까운 Perl 및 PDL에 매핑하여 세 언어가 서로 동의, 차이 또는 보완되는 위치를 강조 표시합니다.
| R type | 펄 등가 | PDL 상응 | Notes |
|---|---|---|---|
더블 (길이-1) |
$x = 3.14 (스칼라) 더블(3.14) — 모양 () R에는 베어 스칼라가 없으며 모든 것이 벡터입니다. |
||
정수 (길이-1) |
$n = 42 (스칼라) 긴(42) |
||
논리적 (길이-1) |
$flag = 1 / $flag = 0 |
바이트(1) |
펄은 진실성을 사용하며, PDL은 0/1바이트를 사용합니다. |
더블 벡터 |
@arr = (1.1, 2.2, 3.3) |
두 배 (1.1, 2.2, 3.3) PDL: 연속; @arr: 포인터 배열 |
|
정수 벡터 |
@arr = (1, 2, 3) |
긴(1, 2, 3) |
|
논리적 벡터 |
@flags = (1, 0, 1) |
바이트(1, 0, 1) |
|
복잡함 벡터 |
— (내장 없음) | cdouble(...) Perl 필요 수학::복합; PDL은 기본 지원 |
|
문자 벡터 |
@strs = ('a','b') |
— (숫자 아님) | PDL은 숫자에서만 작동합니다. |
원시 벡터 |
팩('C*', @bytes) |
바이트(...) |
|
해당 사항 없음 |
정의 해제 |
ndarray의 잘못된 값 | R과 같은 PDL 불량 값 전파’초 해당 사항 없음 |
NULL |
정의 해제 목록 컨텍스트 |
- | |
목록 |
@array 또는 참조 \@array |
— | |
이름 지정됨 목록 |
%해시 또는 \%해시 |
— | |
매트릭스 (2D) |
어레이 배열 @aoa |
2-D ndarray pdl([[...],[...]]) |
PDL: column-major, R: column-major |
배열 (N-D) |
중첩 참조 | N-D ndarray $x-모양(...) |
|
data.frame |
%해시 의 @arrays |
2D 배열(숫자 열) + 펄 해시(혼합) | 단일 PDL 유형 맵이 정확히 없음 |
계수 |
해시 조회 테이블 + @indices |
길게 ndarray + 펄 @levels 배열 |
|
환경 |
%해시 또는 패키지 네임스페이스 |
- | |
함수 / 폐쇄 하위 { ... } / 폐쇄 |
— | PDL PP는 컴파일 된 커널을 정의 | |
S3 / S4 객체 |
축복 참조 + 메소드 디스패치 | PDL 객체(blessed ndarray) | PDL 객체는 일류 Perl 객체입니다. |
주요 요점
순수한 숫자, 동종 데이터(벡터, 매트릭스, 텐서)의 경우 PDL 배열 및 R 원자 벡터는 기능적으로 동등하며 비교적 효율적입니다.
이종 표 형식 데이터**(혼합 유형, 문자열 열, 계수), R’초
data.frame보다 인체 공학적임. Perl은 일반적으로 배열의 해시 또는 다음과 같은 전용 모듈을 사용합니다.자료::프레임또는PDL::IO::CSV.텍스트, 불규칙한 구조, 시스템 접착제, 펄’s 네이티브 타입은 R과 파이썬 둘 다보다 우수하다.
따라서 Perl+PDL 조합은 R이 통계 언어로 제공하는 것과 Perl이 시스템 언어로 제공하는 것의 union을 제공합니다 - 더 가파른 학습 곡선의 비용과 덜 즉시 사용 가능한 통계적 툴링.
그러나 Perl+PDL+R의 조합(후자는 구성요소로 사용됨) 도구화됨 Perl을 통해)
5. 로드맵: 이 시리즈의 나머지 부분이 다루는 내용
이 시리즈는 처음부터 Perl5 + PDL에 내장된 벡터 데이터베이스 엔진의 구성을 문서화합니다. 벡터 데이터베이스는 최신 검색 증강 생성(RAG) 파이프라인, 의미 검색 및 가장 가까운 이웃 권장 시스템을 뒷받침합니다. 첫 번째 원칙에서 하나를 구현하는 것은 PDL을 시연하기위한 훌륭한 수단입니다’Perl과 함께 제공되는 숫자 기능’s 시스템 프로그래밍 강점.
이러한 게시물과 함께 공동 개발 된 디렉토리는 다음 구성 요소를 포함하며, 각 구성 요소는 전용 저장소의 파일을 참조하는 하나 이상의 전용 게시물의 주제가됩니다.
Post 1 — 직렬화 및 I/O: VectorIO 모듈
파일: VectorIO.pm
엔진은 벡터를 내부에 포장된 바이너리 블럽으로 저장합니다. MessagePack 페이로드. 이 글은:
- 클린으로 모듈 설계
수출업자기반 공용 APIv5.40 사용. - 시스템 경계에서 스키마 정확성을 적용하는 검증 도우미입니다.
Post 2 — 벡터 데이터베이스 시뮬레이션
파일: simulate_vectorDB.pl
데이터베이스를 검색하려면 먼저 데이터베이스가 필요합니다. 이 글은:
- 재생 가능한 임의 부동 벡터 생성
PDL::임의. - 사용
GetOpt::긴인체 공학적 CLI 옵션 구문 분석 - 작성 a
--씨드- 모든 실행에서 동일한 데이터베이스를 생성하는 제어 시뮬레이션 - 벤치마킹에 필수적입니다.
포스트 3 — 벤치마킹: The timing_DB 모듈
파일: timing_DB.pm
성과 청구에는 측정이 필요합니다. 이번 포스팅은:
- 재사용 가능한 펄 벤치마킹 하네스
시간::HiRes. - Perl/PDL 및 R 구현 간의 공정한 월-시계 비교 방법론.
- 다양한 워크로드 크기에 대해 처리량(벡터/초)과 대기 시간(밀리초/질의)을 해석합니다.
포스트 4 — K-평균 클러스터링 PDL::Stats::Kmeans
파일: kmeans.pl
K-평균 클러스터링은 대략적으로 가장 가까운 이웃 검색에 대한 역파일 인덱스(IVF) 접근 방식의 중추입니다. 이 글은:
- The
PDL::Stats::Kmeans인터페이스 및 반환 계약(중심,클러스터,n개,R2,초). - 해석
[obs × 클러스터]멤버쉽 마스크 반환자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
중앙집중식으로 데이터베이스를 분할하고 대략적인 하위 선형 근사 이웃 검색을 수행할 수 있습니다. 이 글은:
- 거꾸로 된 목록 만들기: 각 데이터베이스 벡터를 가장 가까운 중심으로 매핑합니다.
- The
unpack_inverted_lists도우미 위치VectorIO. - Querying: 가장 가까운 상위 K 중심점을 찾은 다음 해당 목록만 검색합니다.
- 프로브된 리스트의 수가 다르기 때문에 정확성 대 속도 상충.
포스트 7 — R에 대한 검증: 수치적 정확성 및 상호 언어 파이프라인
파일: compare_kmeans_centroids.R, compare_kmeans_centroids_pure.R, plot_centroid_coordinates.R
기초 시리즈의 마지막 게시물 펄과 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를 정지합니다.
