2014-09-02 1 views
2

1e5 문자열에서 1e7 항목을 샘플링하려고하지만 메모리 오류가 발생합니다. 1e4 문자열에서 1e6 샘플을 정밀하게 샘플링합니다. 4GB RAM이있는 64 비트 시스템에 있는데 1e7에서 메모리 제한에 도달해야한다고 생각하지 않습니다. 어떤 아이디어?mtrand.RandomState.choice에서 메모리 오류를 해결하는 방법?

>>> N = int(1e6) 
>>> np.random.choice(["id%010d"%x for x in range(N//K)], N) 
array(['id0000005473', 'id0000005694', 'id0000004115', ..., 'id0000006958', 
     'id0000009972', 'id0000003009'], 
     dtype='<U12') 

오류 N = 1E7과 :

$ python3 
Python 3.3.3 (default, Nov 27 2013, 17:12:35) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy as np 
>>> K = 100 

은 1E6로 잘 작동

>>> N = int(1e7) 
>>> np.random.choice(["id%010d"%x for x in range(N//K)], N) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "mtrand.pyx", line 1092, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:8229) 
MemoryError 
>>> 

나는이 질문을 발견하지만이 같은 오류를 잡는 것이 아니라 해결하는 것 같다 그것.

Python not catching MemoryError

나는 해결책은 아직이 작업을 수행 random.choice하거나 다른 방법을 사용하여 하나에 만족하실 것입니다. 감사.

+0

리샘플링을 허용하고 있으므로 필요한 간격의 난수를 사용하여 작업을 볼 수 있습니다. – doctorlove

+0

@doctorlove Thx. 나는'[ 'a', 'b', 'c'] [np.random.choice (2,1)]'을 시도해 보았습니다. 그러나'[ ','b ','c '] [np.random.choice (2,5)]'는 TypeError를 제공합니다. 난수로 문자열을 선택하려면 어떻게해야합니까? 나는'.tolist()'도 시도했지만 여전히 TypeError이다. –

+0

사물 = [ 'a', 'b', 'c']; [np.random.choice (x2)의 x에 대한 것들 [x] – doctorlove

답변

1

당신은 발전기 기능을 사용하여이 둥근 작업 할 수 있습니다

def item(): 
    for i in xrange(N): 
     yield "id%010d"%np.random.choice(N//K,1) 

이 한 번에 메모리에있는 모든 항목을 필요로 방지 할 수 있습니다.

+0

감사합니다. 이걸 시도해 봤어. 생성기를'pandas.DataFrame()'에 전달할 수 있습니까? 나는 그것을 테스트하고 그것이 작동하는지 확신하지 못한다. –

+0

그 컬럼에있는'groupby'도 생성자를 반환한다는 것을 의미합니다. 판다가 발전기 내부에 도달하는 것보다 단일 그룹을 만든 것처럼 느껴집니다. 그래서 팬더에 전달하기 전에 발전기를 평가해야하는지 궁금합니다. –

+0

팬더의 버전에 의존하는 것 같습니다 : http://stackoverflow.com/questions/18915941/create-a-pandas-dataframe-from-generator 또는 http://stackoverflow.com/questions/19605537/how-to- create-lazy-evaluated-dataframe-columns-in-pandas – doctorlove

관련 문제