2014-10-25 2 views
2

나의 출발점은 NumPy와의 기능 loadtxt에 문제가 있었다. 나는 그것을 봤고 this question on StackOverflow에왔다. 파이썬 MemoryError의 또는 ValueError를 np.loadtxt 및 iter_loadtxt이

> data = data.reshape((-1, iter_loadtext.rowlength)) 
> ValueError: total size of new array must be unchanged 

가 그럼이 코드 행의 수와 COLS의 최대 수를 추가하려고 : 즉, 다음과 같은 솔루션 주었다
def iter_loadtxt(filename, delimiter=',', skiprows=0, dtype=float): 
    def iter_func(): 
     with open(filename, 'r') as infile: 
      for _ in range(skiprows): 
       next(infile) 
      for line in infile: 
       line = line.rstrip().split(delimiter) 
       for item in line: 
        yield dtype(item) 
     iter_loadtxt.rowlength = len(line) 

    data = np.fromiter(iter_func(), dtype=dtype) 
    data = data.reshape((-1, iter_loadtxt.rowlength)) 
    return data 

data = iter_loadtxt('your_file.ext') 

그래서 내가 그 시도를하지만 다음과 같은 오류 메시지가 발생

num_rows = 0 
max_cols = 0 
with open(filename, 'r') as infile: 
    for line in infile: 
     num_rows += 1 
     tmp = line.split(",") 
     if len(tmp) > max_cols: 
      max_cols = len(tmp) 

def iter_func(): 
    #didn't change 

data = np.fromiter(iter_func(), dtype=dtype, count=num_rows) 
data = data.reshape((num_rows, max_cols)) 

하지만 그것은해야한다고 생각하지만이 여전히 같은 오류 메시지가 준 : 나는 부분적으로 from another question있어 부분적으로 자신을 썼다 여기 아래 코드 조각과 해결되었습니다. 반면에 나는 data.reshape(..)을 올바른 방식으로 호출하는지 확신 할 수 없다.

나는 어떤 일이 일어 났는지 보려면 date.reshape(..)이 호출 된 규칙에 주석을 달았습니다.

> ValueError: need more than 1 value to unpack 

뭔가 X,이 문제에 관한 모든 변수와 함께 수행되는 경우 첫 번째 점에서 일어난 : 즉,이 오류 메시지를 주었다.

이 코드는 내가 사용하는 입력 파일에서 작동 할 수 있음을 알고 있습니다. 그러나 나는 왜 내가이 문제를 해결할 수 없는지 알 수 없다. 32 비트 Python 버전 (64 비트 Windows 시스템)을 사용하고 있기 때문에 다른 컴퓨터에서 발생하지 않는 메모리 문제가 발생합니다. 그러나 나는 확실하지 않다. 정보를 위해 : 나는 1.2GB 파일을 위해 8GB의 RAM을 가지고있다. 그러나 나의 RAM은 작업 관리자에 따라 가득 차 있지 않다.

내가 해결하고 싶은 것은 오픈 소스 코드를 사용하여 주어진 파일을 읽고 구문 분석해야한다는 것입니다.하지만 내 메모리 내에서는 np.loadtxt(filename, delimiter=",")과 같습니다. 나는 MacOsx와 Linux에서 원래 작동했던 코드를 알고 있고, 더 정확하게 말하면 : "MacOsx 10.9.2와 Linux (버전 2.6.18-194.26.1.el5 ([email protected]) (gcc 버전 4.1.2 20080704 (Red Hat 4.1.2-48)) 1 SMP Tue Nov 9 12:46:16 EST 2010). "

시간에 대해서는별로 신경 쓰지 않습니다. 내 파일에는 100 또는 1000 (입력 파일에 따라 하나는 항상 100, 항상 하나는 1000) 항목이 한 줄에 -200.000 줄 포함되어 있습니다. 한 항목은 음수가 아닌 3 자리가있는 부동 소수점이고 그들은 ,과 공백으로 구분됩니다. 예 : [..] 0.194, -0.007, 0.004, 0.243, [..] 및 100 개 또는 100 개의 항목 중 4 개는 + -200.000 줄입니다.

저는 오픈 소스 코드가 필요하기 때문에 파이썬 2.7을 사용하고 있습니다.

해결 방법이 있습니까? 미리 감사드립니다.

+1

'reshape'를 올바른 방법으로 사용하고 있습니다. 그러나'count = num_rows'는 버그이며 두 번째 코드에서 오류가 발생합니다. 그것은 총 값이어야합니다. 그래서'count = num_rows * num_cols'. –

+0

감사합니다. 하지만 이제'X = np.asfortranarray (X, [..])'에 MemoryError가 생겼습니다. dtype은'iter_loadtxt'에서 사용하는 것과 같습니다. 그것은 내 기계가 프로세스에 줄 수있는 RAM의 끝이 아닌 메모리의 -700mb에서 멈 춥니 다 ... – Renzeee

+1

OK. 다음 문제는 연속적인 * 메모리 주소가 부족하다는 것입니다. 솔직히 64 비트 OS에서 32 비트 프로세스가 어떻게 작동하는지 모르겠습니다. 여하튼, 가장 쉬운 해결책은 64 비트 Python을 얻는 것입니다. 어쩌면 [WinPython '] (http://winpython.sourceforge.net/)은 64 비트와 이식성이 뛰어 나기 때문에 좋습니다. –

답변

1

Windows에서 32 비트 프로세스는 최대 2GB (또는 GiB?) 메모리 만 제공되고 numpy.loadtxt은 메모리가 많은 것으로 유명하기 때문에 첫 번째 방법이 작동하지 않는 이유를 설명합니다.

두 번째로 직면하는 문제는 테스트중인 특정 파일에 데이터가 누락되었습니다. 즉, 모든 행의 수가 동일한 값이 아닌 것입니다.다음과 같이 쉽게 확인할 수 있습니다.

import numpy as np 

numbers_per_line = [] 
with open(filename) as infile: 
    for line in infile: 
     numbers_per_line.append(line.count(delimiter) + 1) 

# Check where there might be problems 
numbers_per_line = np.array(numbers_per_line) 
expected_number = 100 
print np.where(numbers_per_line != expected_number) 
+0

첫 번째 것을 알지 못했습니다. 고마워요. 귀하의 코드를 사용하고 모든 라인에 expected_number가 있으므로 문제가 될 수는 없다고 말합니다. 불행히도. – Renzeee

관련 문제