2013-12-10 3 views
0

대용량 파일 (> 10GB)을 읽고 배열의 데이터를 해당 파일의 각 행 끝에 쓰도록 스크립트를 작성하고 있습니다. 여기에 내 코드각 열의 데이터를 읽고 마지막으로 perl 행에 인쇄하십시오.

my $count=0; 
    while(my $lines = <$FILE>){ 
     seek $FILE, length($lines), 1; 
     print $FILE "\t", $array[$count]; 
     $count++; 
     } 

입니다하지만 난 방법을 모색하여 행의 끝을 찾는 틀렸다 생각합니다. 나는이 문제를두고 머리를 맞출 수가 없었다. 누구든지이 코드에서 잘못된 점을 볼 수 있습니까? 처리 후의

my 1st line 
my 2nd line 
my 3rd line 

....

my 1st line data1 
my 2nd line data2 
my 3rd line data3 

DATA1, DATA2, ... DATA3 처리 전에 @array에있다. 코드에

세부 사항 :

  • FILE이 + < 모드 (읽기/쓰기)에서 열이
  • FILE 라인은 탭으로 구분됩니다.
  • @array가 data1,2을 보유하고 ...

문제 : 각 라인의

감사를 종료 포인터를 이동

  • ,

    로빈

+0

왜 각 행에 데이터를 추가하여 새 파일을 만들지 않으십니까? – Kenosis

+0

인쇄하는 데이터는 "삽입"되어 있지 않습니다. 이미 존재하는 것은 무엇이든 덮어 씁니다. 고정 길이 레코드가있는 2 진 파일에서는 괜찮을 수 있습니다. 귀하의 경우 현재 데이터 (줄 바꿈 포함)를 덮어 쓰는 것 같습니다. 두 번째 파일을 작성하는 것이 더 쉬울 것입니다. – rutter

+0

제안에 감사드립니다 _ @ Kenosis_ & _ @ rutter_. 여기서 문제는 필자가 작성한 파일에는 빈 파일부터 시작할 수 있지만 수백만 줄의 줄과 1000 줄의 줄이 있다는 것입니다. 모든 데이터 배열에 대해 파일을 작성해야합니다 (행 * cols) 번. 이것은 성능 병목 될 것입니다. 그래서 성능을 최적화하기 위해 다른 방법으로이 작업을 수행하려고합니다. _ @ Borodin_ 제안을 시도하고 곧 스레드를 업데이트합니다 !! – Robin

답변

2

그럴 수 없습니다. 파일의 위치를 ​​찾고 그 위치로 인쇄하면 해당 위치의 데이터를 덮어 씁니다.

파일의 내용에 배열로 액세스 할 수 있도록 Tie::File을 사용하는 것이 좋습니다. 따라서 파일의 줄 끝에 추가하는 것은 단순히 배열의 요소 중 하나에 문자열을 추가하여 수행됩니다.

코드는 다음과 같습니다. @newdata을 생성하는 줄은 테스트 용으로 만 존재합니다. 귀하의 질문에있는 것처럼 data1, data2 등의 줄과 함께 파일과 길이가 같은 배열을 만듭니다.

15GB 파일을 처리하는 데 약간의 시간이 걸리며 처음에는 더 작은 파일에서 테스트해야합니다. 또한이 파일을 덮어 쓰므로 버그가있는 경우 데이터가 삭제됩니다.

use strict; 
use warnings; 

use Tie::File; 
use Fcntl 'O_RDWR'; 

tie my @file, 'Tie::File', 'myfile', mode => O_RDWR or die $!; 

my @newdata = map sprintf('data%d', $_ + 1), 0 .. $#file; 

my $i = 0; 
for my $line (@file) { 
    $line .= "\t" . $newdata[$i]; 
    ++$i; 
} 

untie @file; 
+0

고맙습니다 _ @ Borodin_. 그것은 작동합니다 !!! 여기에 간단한 질문이 있습니다 ...우리가 배열에 파일을 묶을 때 파일 데이터 (라인)는 메모리에 저장됩니까 ?? – Robin

관련 문제