2016-10-13 5 views
0

거대한 CSV 파일 (20G 이상)을 처리하려고했지만 전체 CSV 파일을 메모리로 읽을 때 프로세스가 중단되었습니다. 이 문제를 피하기 위해 두 번째 줄을 한 줄씩 읽으려고합니다.거대한 CSV 파일의 데이터를 효율적으로 읽음

예를 들어

, 2 열이 포함

  1. XXX 같은 데이터는 컴퓨터 알고리즘을 내 코드는 전체 열을 위해 일하고

    import collections 
    
    wordcount = collections.Counter() 
    
    with open('desc.csv', 'rb') as infile: 
        for line in infile: 
         wordcount.update(line.split()) 
    

를 구축,

  • XXX 좋다 CSV 리더를 사용하지 않고 두 번째 열만 읽는 방법은 무엇입니까?

  • +0

    많은 양의 데이터를 메모리에로드하는 대신 반복 (for 루프/출력)을 사용할 수 있습니다. 나는 당신이 각 부분에 대해 얼마나 많은 통제력을 갖고 있는지 모르기 때문에 예를들 수 없습니다. –

    +0

    @DennisKuypers, 감사합니다. 얼마나 많은 통제력을 갖고 있니? – Kun

    +0

    무슨 뜻입니까? 코드를 변경하거나 한 라이브러리의 결과를 다음 라이브러리로 가져갈 수 있습니까? 어쩌면'descs : 무언가를 위해'를 사용하여 결과를 하나씩 반복 할 수 있습니다. 아마도'.tolist()'를 생략해야 할 것이다. 다시, 나는 도서관을 모른다. 그래서 나는 당신에게 적절한 방법을 말할 수 없다. –

    답변

    0

    내가 아는 한, csv.reader(infile)을 호출하면 전체 파일이 열리고 ... 어디서 문제가 발생합니까?

    당신은 단지 한 줄 한 줄을 읽고 수동 구문 분석 할 수 주어진 시간 (한 줄)에서 메모리에있는 파일의 작은 덩어리를 유지합니다

    X=[] 
    
    with open('desc.csv', 'r') as infile:  
        for line in infile: 
         # Split on comma first 
         cols = [x.strip() for x in line.split(',')] 
    
         # Grab 2nd "column" 
         col2 = cols[1] 
    
         # Split on spaces 
         words = [x.strip() for x in col2.split(' ')] 
         for word in words:  
         if word not in X: 
          X.append(word) 
    
    for w in X: 
        print w 
    

    . 그러나 변수 X이 상당히 큰 크기로 증가하여 메모리 제한으로 인해 프로그램이 오류가 발생할 수있는 문제가 발생할 수 있습니다.

    +0

    감사합니다. 그러나 예제는 첫 번째 열에 대해서만 사용할 수 있습니다. 3 번째 열이면 x.strip()이 올바르지 않습니까? – Kun

    +0

    죄송합니다. 열의 의미를 오해 한 것일 수도 있습니다. 나는 "컴퓨터가 좋다"고 가정했다. 그 다음 줄에는 "알고리즘 만들기"가있다. 'x.strip()'을 사용하는 곳에서/split()은 입력 파일에 대해 작동하는 것처럼 쉽게 'csv.reader()'가 될 수 있습니다. – bornruffians

    +0

    작동하지 않아 답변을 수정할 수 있습니까 – Kun

    0

    질문에있는 코드는 20G 파일을 읽고 각 줄을 공백으로 구분 한 다음 개의 숫자를 유지하는 카운터를 만드는 것입니다.은 모두 고유합니다. 토큰. 나는 그것이 당신의 기억이 가고있는 곳이라고 말하고 싶습니다. 수동 csv.reader 가입일

    반복자

    csvfile 소정의 라인을 반복하는 리더 목적이다. csvfile 반복자 프로토콜을 지원하고 는 다음() 메소드가

    그래서 csv.reader를 사용하여 큰 파일을 반복 할 괜찮

    를 호출 할 때마다 문자열을 반환하는 모든 객체가 될 수 있습니다.

    import collections 
    
    wordcount = collections.Counter() 
    
    with open('desc.csv', 'rb') as infile: 
        for row in csv.reader(infile): 
         # count words in strings from second column 
         wordcount.update(row[1].split()) 
    
    관련 문제