2014-12-26 2 views
0

9 열 (구분 기호로 "|")이있는 호출 정보 레코드 (CDR)의 큰 파일 (3 * 10^7 행)이 있습니다. 각 행은 다음 속성을 가진 통신 인스턴스입니다.사용자가 대용량 파일 분할

Date|Time|Duration|Caller|Receiver|serviceType|junk|cellReceiver|cellCaller|CallerLAC 

이 파일을 사용자별로 작은 덩어리로 분할해야합니다. 따라서 각 파일은 사용자가 발신자인지 수신자인지에 관계없이 사용자가 모든 통신을합니다 (즉 A가 B를 호출하면이 행은 두 파일, 사용자 A의 파일 및 사용자 B의 파일에 나타납니다).

이 작업을 효율적으로 수행하는 가장 좋은 방법은 무엇입니까? (OS X Yosemite를 사용하고 있습니다).

+0

특정 언어/플랫폼은 무엇입니까? – Anonymous

+0

터미널 (MAC) 또는 Python을 사용하는 것이 바람직합니다. 나는 이것을 포함하도록 질문을 편집 할 것이다. – amaatouq

+0

csv 모듈을 사용하여 파일을 반복하는 등 시스템에서 간단한 해결책이 얼마나 느린 지 확인하십시오. (cdr_user_A.txt & cdr_user_B.txt) –

답변

2

bash 및 awk - 제목에 파이썬을 요청했음을 압니다. 이것이 숙제 인 쉘이 아니라면 충분합니다.

awk -F '|' {u1=$4 
      u2=$5 
      arr[u1]=arr[u1] $0 "\n" 
      if(u2==u1) continue; 
      arr[u2]=arr[u2] $0 "\n" 
      } 
      END { 
       for (i in arr) {fname=i 
           print arr[i] > fname 
           close(fname) 
           } 
      } ' inputfile 

일부 명명 된 변수는 더 읽기 쉽게하기 위해 사용되었습니다. 귀하의 데이터는 모든 출력 파일에서 3 천만 라인 이상을 생성 할 수 있습니다. 나는 데이터베이스 제안에 동의한다. 허용 된 메모리에 대해 ulimit을 확인하십시오. 이것은 많이 사용합니다. 파일 시스템에서 파일 inode 제한을주의하십시오.

1

절대적으로 별도의 파일이어야합니까?

특정 언어로 태그하지 않았으므로 : 개인적으로, 필자는 파이프로 구분 된 ('|') ASCII (질문이 없으므로 ASCII로 가정)로 SQL 데이터베이스에 가져옵니다.
장점 :

  1. 구문 분석이 아닌 문제 당신은 출력은 그러나 당신이 원하는 수
  2. 쿼리 간단한보다 더 복잡한 코드를 작성하지 않고도 당신이
  3. 복잡한 쿼리가 가능 원하는 방식의 데이터 SQL SELECT
  4. 거의 모든 데이터베이스 또는 플랫폼에서 지원되는 접근 방식
+0

안타깝게도 절대적으로 별도의 파일이어야합니다 (이미 설치된 시스템은 사용자 당 하나의 파일을 필요로합니다). – amaatouq

+1

아, 그러면 그 아이디어를 취소하십시오! (그래도 다른 사람이 비슷한 문제가있는 경우 대답을 남깁니다) – frasnian