2012-10-18 4 views
0

거대한 파일을 열고 아래 형식으로 레코드가있는 펄 스크립트 작업을하고 있습니다. 내가 입력 파일의 첫 번째 필드 파일 이름을 읽을 때 스크립트 내가이 나던 존재하는 경우 새 파일을 만들고 파일에 필드의 나머지 부분을 인쇄해야 솔라리스 10 또는 HP UX 11.0perl에서 열 수있는 최대 파일 핸들

Filename1 , col1, col2 
Filename1 , col1, col2 
Filename2 , col1, col2 
Filename3 , col1, col2 

에서 실행될 수 있습니다 . 입력 파일에 13000 U 파일 이름이있을 수 있습니다. Solaris 10 또는 hpux 11에서 최대 몇 개의 파일 핸들을 열 수 있습니까? 13000 개의 파일 핸들을 열 수 있습니까? 해시를 사용하여 파일 핸들을 저장하고 파일에 저장하고 닫는 계획. 또한 전체 파일의 첫 번째 필드에서 어떻게 고유 한 파일 이름을 쉽게 얻을 수 있습니까? 파일의 각 줄을 읽는 대신에 쉽게 할 수 있습니까?

+0

시스템만큼이나 열리게 할 것입니다. – ikegami

답변

1

파일 핸들의 최대 수

그러나 많은 파일이 부당 처리 개방 ulimit (manual page is here)를 참조 OS가 달려있다 (그리고 구성이다). 알고리즘에 대해 다시 생각해보십시오.

+0

정보를 제공해 주셔서 감사합니다. 하드 한계를 어떻게 확인합니까? Solaris 10에서 /etc/security/limits.conf 파일을 찾을 수 없습니다. solaris10에는 system.conf가 없습니다. 설정 파일이 어디에 있는지 잘 모르겠습니다. – Arav

0

아니요, 전체 파일을 읽지 않고 모든 고유 한 파일 이름을 가져올 방법이 없습니다. 그러나 파일을 처리하는 동안이 목록을 생성 할 수 있습니다. 행을 읽을 때 파일 이름을 해시의 키로 추가하십시오. 마지막에는 해시 키를 인쇄하십시오.

+0

정보를 많이 주셔서 고마워요. – Arav

0

시스템에서 허용하는 항목을 모르지만 FileCache 모듈을 사용하면 시스템에서 허용하는 것보다 많은 파일 핸들을 열 수 있습니다. 이것은 핵심 Perl 모듈이므로 설치하지 않아도됩니다.

전체 파일을 읽지 않고 첫 번째 열을 텍스트 파일에서 가져올 방법이 없습니다. 왜냐하면 텍스트 파일에는 실제로 열이나 짝수 행의 내부 구조가 없기 때문입니다. 그들은 단지 하나의 긴 문자열 일뿐입니다. 각 "줄"을 찾는 유일한 방법은 전체 파일을 살펴보고 줄 바꿈 문자를 찾는 것입니다.

그러나 대용량 파일조차도 일반적으로 Perl에서 매우 빠르게 처리됩니다. 이것은 문제가되지 않을 것입니다.

my %files; 
while (<FILE>) { /^(\S+)/ and $files{$1}++; } 

이 각 파일이 발생 횟수의 카운트 끝 : 여기에 고유 한 파일 이름 (파일을 파일로 열 가정)를 얻을 수있는 간단한 코드입니다. 파일 이름에 공백이 들어 있지 않다고 가정합니다. 나는 30,000 라인 이상을 가지고 이것에 대한 빠른 테스트를했고, 그것은 즉각적이었습니다.

+0

나는 ulimit 명령을 읽습니다. 하드 제한을 넘을 수 없다고합니다. 루트 사용자 만 변경할 수 있습니다. FileCache 모듈이 소프트 한도를 설정합니까? 또한 파일을 열고 닫는 일반적인 방법보다 빠르게 작동합니까? 붙여 넣은 코드에서 정규 expitsion에서 하나 이상의 공백 검사를 수행하고 해시 맵에 추가하는 기능은 무엇입니까? 파일은 CSV 파일이고 첫 번째 필드 만 필요합니다. – Arav