2017-10-29 6 views
0

안녕하세요 1000000에서 2000000까지 숫자 목록을 생성하고 싶지만 문제는 오류 메모리 오류가 발생했습니다. 무작위로 모든 것이 유용했기 때문에 숫자 만 얻을 수 있었고 숫자가 중복되어 나타났습니다.숫자 목록 생성

data = [] 
total = 2000000 
def resource_file(info): 
    with open(info, "r") as data_file: 
     reader = csv_reader(data_file, delimiter=",") 
     for row in reader: 
      try: 
       for i in xrange(1000000,total): 
        new_row = [row[0], row[1], i] 
        data.append(new_row) 
      except IndexError as error: 
       print(error) 
    with open(work_dir + "new_data.csv", "w") as new_data: 
     writer = csv_writer(new_data, delimiter=",") 
     for new_row in data: 
      writer.writerow(new_row) 
+1

모든 것을 메모리에 저장하기 전에 모든 것을 저장하려고합니다. 전체 파일을 메모리에 저장하는 대신 한 번에 한 행만 처리하여 메모리를 적게 사용할 수 있습니다. –

+0

입력 된 CSV 파일에있는 것보다 1000000 배 더 많은 요소를 만드시겠습니까? 원하는 결과는 무엇입니까? CSV 파일의 작은 예와 결과 CSV 파일의 모양을 알려주십시오. – trincot

+0

행 번호 2 – Mike

답변

3

반복을

문제 1M..2M

에 이르기까지 여분의 열이있는 모든 라인을 xrange로 전환하면 먼저 메모리에 모든 구성을 저장하는 것입니다. 첫 번째 Python은 매우 효율적인 메모리 모델이 아니며, 행당 백만 엔트리도 ​​상당히 큽니다.

나는 목록에서 데이터를 저장, 단순히 즉시 파일에 다음을 쓸 것을 제안

: 파일의

total = 2000000 
def resource_file(info): 
    with open(info, "r") as data_file: 
     reader = csv_reader(data_file, delimiter=",") 
     with open(work_dir + "new_data.csv", "w") as new_data: 
      writer = csv_writer(new_data, delimiter=",") 
      for row in reader: 
       rowa, rowb = row[0:2] 
       for data in xrange(1000000,total): 
        writer.writerow([rowa,rowb,data]) 

테이크 행 1M-2M 경우

당신이 라인을 먹고 싶어 원본 파일의 2M에 1M, 당신은 그것을 쓸 수 있습니다 :

from itertools import islice 

total = 2000000 
def resource_file(info): 
    with open(info, "r") as data_file: 
     reader = csv_reader(data_file, delimiter=",") 
     with open(work_dir + "new_data.csv", "w") as new_data: 
      writer = csv_writer(new_data, delimiter=",") 
      for row in islice(reader,1000000,total): 
       writer.writerow(row) 

또는 @JonClemens 말한다처럼 당신과 함께 그것을 단순화 할 수 있습니다

from itertools import islice 

total = 2000000 
def resource_file(info): 
    with open(info, "r") as data_file: 
     reader = csv_reader(data_file, delimiter=",") 
     with open(work_dir + "new_data.csv", "w") as new_data: 
      writer = csv_writer(new_data, delimiter=",") 
      writer.writerows(islice(reader,1000000,total))
+0

에 csv 파일의 모든 줄에 숫자를 추가하고 싶습니다.하지만이 방법으로는 rowa가 좋을 것입니다. rowb는 루프 외부에 있습니다. – Mike

+0

@Mike : 아니요, * 읽기 * 루프에 있습니다. –

+0

예. 정보 파일의 모든 줄이 반복됩니다. = 총량은 2000000입니다. – Mike