2012-01-03 2 views
8

두 개의 다른 파일을 결합하여 일부 데이터를 처리해야합니다. 둘 다 기본 키를 형성 할 수있는 두 개의 컬럼을 가지고있어 이들을 나란히 맞출 수 있습니다. 질문에있는 파일은 거대합니다 (약 5GB 및 2,000 만 행). 그래서 효율적인 코드가 필요합니다. Perl에서 어떻게 할 수 있습니까?Perl에서 SQL과 같은 결합을 수행하는 방법은 무엇입니까?

나는 예를 들어 줄 : 파일 A가 열

을 포함

경우

id, name, lastname, dob, school 

파일 B는 열

을 포함을
address, id, postcode, dob, email 
내가 ID를 일치시켜이 두 파일에 가입해야합니다

dob 두 개의 파일에 다음 열이있는 출력 파일이 있습니다.

id, name, lastname, dob, school, address, postcode, email 
+1

얼마나 많은 RAM이 있습니까? –

답변

8

새로운 mysql/sqlite/뭐든간에 DB를 만들고 행을 삽입한다고 생각해보십시오. ~ 20 줄의 perl이어야합니다.

은 물론,

당신은 또한 흥미있는 분야로 파일을 정렬 한 후 파일 1의 각 줄을 찾아 파일 2에 일치하는 라인을 인쇄 할 수있는 추측에 .. DB에 쉽게 액세스 할 수 있어야합니다.

+1

대부분의 배포판에는 sqlite 모듈이 있습니다. – shaun5

+2

...CPAN (DBD :: SQLite)에서 직접 SQLite의 복사본을 만들 수 있습니다. 많은 양의 데이터를 SQLite에 삽입 할 때 큰 트랜잭션을 사용하는 것이 중요합니다. – tsee

0

또는이 멋진 Techrepublic 기사를 읽으십시오. 그래도 5G 메모리가 필요합니다. 나는 unix/linux CLI 정렬/결합 유틸리티를 사용하여 효율이 좋은 곳으로가는 것이 궁금합니다. 그냥 생각.

2

이 작업을 수행하는 구식 방법은 시스템 유틸리티를 사용하여 두 파일을 키 시퀀스로 정렬 한 다음 한 줄씩 일치시키는 것입니다. 키가 출력 데이터와 일치하면 두 파일을 모두 읽습니다. 일치하지 않는 경우 일치 할 때까지 더 작은 키가있는 파일을 읽습니다. 파일에 대해 키를 무한히 높게 설정하십시오 (예 : eof). 두 키가 모두 무한대로 높으면 완료됩니다.

+0

시스템 유틸리티'join'은 입력이 정렬되어 있으면 조인을 수행합니다. – reinierpost

+0

신난다. 그것을 알지 못했다. 감사. –

0

사실이 시도하지 않은,하지만 더 창조적 인 솔루션이 될 수 :

  1. 한 번 각 파일을 읽고 고유 ID + DOB 조합 및 파일에서의 위치와지도를 만들 수 있습니다. tell()을 사용하십시오.
  2. 그가지도 int로 위치를 사용하여 파일의 실제 데이터를 읽어 펄
  3. 의지도를 만들고 sysread()
  4. 당신은 또한 나의 3 년 사용할 수있는 새로운 파일
0

에 데이터 쓰기 -old CPAN 모듈 Set :: Relation은 이와 같은 일을하도록 설계되어 Perl에 가입하는 것과 같은 모든 SQL 기능을 수행하게합니다. 각 파일에 대해 Set :: Relation 객체를 만든 다음 join() 메서드를 사용합니다. 즉,이 모듈은 모든 피연산자를 유지하고 결과를 메모리에 저장하므로 RAM에 의해 제한됩니다. 그러나 join()이 어떻게 작동하는지 소스 코드를 살펴본 다음이를 기반으로보다 효율적인 버전을 구현할 수 있습니다.