2015-01-16 4 views
2

내 노트북 ​​(4GB RAM)을 통해 SQL Server로 마이그레이션하려는 레코드가 약 3 백만 개에 이르는 csv 파일이 있습니다.팬더를 사용하여 DB로 큰 csv 가져 오기

pandas 성공적으로 DataFrame (pd.read_csv())에 파일을 읽고,하지만 난 (.to_sql())를 마이그레이션 할 때 나는 Memory Error가 나타납니다

--------------------------------------------------------------------------- 
MemoryError        Traceback (most recent call last) 
<ipython-input-12-94c146c2b7b7> in <module>() 
----> 1 csv.to_sql(name='stats', con=engine, if_exists='append') 

C:\Python27\lib\site-packages\pandas\core\generic.pyc in to_sql(self, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype) 
    964    self, name, con, flavor=flavor, schema=schema, if_exists=if_exists, 
    965    index=index, index_label=index_label, chunksize=chunksize, 
--> 966    dtype=dtype) 
    967 
    968  def to_pickle(self, path): 

C:\Python27\lib\site-packages\pandas\io\sql.pyc in to_sql(frame, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype) 
    536  pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index, 
    537      index_label=index_label, schema=schema, 
--> 538      chunksize=chunksize, dtype=dtype) 
    539 
    540 

C:\Python27\lib\site-packages\pandas\io\sql.pyc in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype) 
    1170       schema=schema, dtype=dtype) 
    1171   table.create() 
-> 1172   table.insert(chunksize) 
    1173   # check for potentially case sensitivity issues (GH7815) 
    1174   if name not in self.engine.table_names(schema=schema or self.meta.schema): 

C:\Python27\lib\site-packages\pandas\io\sql.pyc in insert(self, chunksize) 
    715 
    716     chunk_iter = zip(*[arr[start_i:end_i] for arr in data_list]) 
--> 717     self._execute_insert(conn, keys, chunk_iter) 
    718 
    719  def _query_iterator(self, result, chunksize, columns, coerce_float=True, 

C:\Python27\lib\site-packages\pandas\io\sql.pyc in _execute_insert(self, conn, keys, data_iter) 
    689 
    690  def _execute_insert(self, conn, keys, data_iter): 
--> 691   data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter] 
    692   conn.execute(self.insert_statement(), data) 
    693 

MemoryError: 

저를 성공적으로 마이그레이션을 할 수 있도록 할 다른 방법이 있나요?

  1. 덩어리에 CSV를 읽은 후 SQL DB에 기록하고
  2. 반복 또는 당신이

그래서에 대한 DB에 덩어리 작성할 수 있습니다

+2

에 대한 PARAM 당신은 덩어리가 이렇게 한 번에 50,000 행을 읽어 SQL로 작성하고 반복 할 수있다, ['read_csv'] (HTTP위한'chunksize'의 PARAM있다 /pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csv) – EdChum

+0

실제로 ['to_sql']에 대한'chunksize' 매개 변수가 있습니다 (http://pandas.pydata.org /pandas-docs/stable/generated/pandas.DataFrame.to_sql.html#pandas.DataFrame.to_sql) 기본적으로 이것은 None입니다. 이는 모든 행을 한 번에 작성한다는 것을 의미합니다.이 값을 일부 값으로 설정하고 당신은 간다 – EdChum

답변

6

나는 당신이이 방법을 생각 read_csv에는 chunksize 매개 변수가 있습니다./:

가 동등하게 또한 chunksizeto_sql

+0

우수 : 그것은 작동합니다 :'pd.read_csv (..., chunksize = 1000)의 데이터 : data.to_sql (...)'. 나는 언급하기 위해'.to_sql (chunksize = ...) '과 관련하여 운이 없었습니다. – theta

+0

@theta 다행스럽게도 접근 방식이 효과적이었습니다. SQL을 사용하지 않아서 왜 작동하지 않는지 모릅니다. – EdChum