2016-08-24 1 views
2

Ich füge Dateien in 4 Ordnern zusammen. Innerhalb dieser 4 Ordner füge ich 80 .dbf Dateien zusammen, von denen jede 35 Megabyte ist. Ich verwende den folgenden Code ein:Speicherfehler, obwohl RAM frei ist

import os 
import pandas as pd 
from simpledbf import Dbf5 

list1=[] 
folders=r'F:\dbf_tables' 
out=r'F:\merged' 
if not os.path.isdir(out): 
    os.mkdir(out) 
for folder in os.listdir(folders): 
    if not os.path.isdir(os.path.join(out,folder)): 
     os.mkdir(os.path.join(out,folder)) 
    for f in os.listdir(os.path.join(folders,folder)): 
     if '.xml' not in f: 
      if '.cpg' not in f: 
       table=Dbf5(os.path.join(folders,folder,f)) 
       df=table.to_dataframe() 
       list1.append(df) 
       dfs = reduce(lambda left,right: pd.merge(left,right,on=['POINTID'],how='outer',),list1) 
       dfs.to_csv(os.path.join(out,folder,'combined.csv'), index=False) 

fast unmittelbar nach Ausführen des Codes erhalte ich diesen Fehler:

Traceback (most recent call last): 

    File "<ipython-input-1-77eb6fd0cda7>", line 1, in <module> 
    runfile('F:/python codes/prelim_codes/raster_to_point.py', wdir='F:/python codes/prelim_codes') 

    File "C:\Users\spotter\AppData\Local\Continuum\Anaconda_64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile 
    execfile(filename, namespace) 

    File "C:\Users\spotter\AppData\Local\Continuum\Anaconda_64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 

    File "F:/python codes/prelim_codes/raster_to_point.py", line 66, in <module> 
    dfs = reduce(lambda left,right: pd.merge(left,right,on=['POINTID'],how='outer',),list1) 

    File "F:/python codes/prelim_codes/raster_to_point.py", line 66, in <lambda> 
    dfs = reduce(lambda left,right: pd.merge(left,right,on=['POINTID'],how='outer',),list1) 

    File "C:\Users\spotter\AppData\Local\Continuum\Anaconda_64\lib\site-packages\pandas\tools\merge.py", line 39, in merge 
    return op.get_result() 

    File "C:\Users\spotter\AppData\Local\Continuum\Anaconda_64\lib\site-packages\pandas\tools\merge.py", line 217, in get_result 
    join_index, left_indexer, right_indexer = self._get_join_info() 

    File "C:\Users\spotter\AppData\Local\Continuum\Anaconda_64\lib\site-packages\pandas\tools\merge.py", line 353, in _get_join_info 
    sort=self.sort, how=self.how) 

    File "C:\Users\spotter\AppData\Local\Continuum\Anaconda_64\lib\site-packages\pandas\tools\merge.py", line 559, in _get_join_indexers 
    return join_func(lkey, rkey, count, **kwargs) 

    File "pandas\src\join.pyx", line 160, in pandas.algos.full_outer_join (pandas\algos.c:61256) 

MemoryError 

aber nur 30% meines Speichers verwendet wird, das so ziemlich die Basislinie ist.

EDIT:

ich nur zwei Dateien ausgesucht und versucht, die Zusammenführung mit:

merge=pd.merge(df1,df2, on=['POINTID'], how='outer') 

und noch einen Speicherfehler bekommen, etwas Unheimliches vor sich geht.

Wenn ich die gleiche Sache in 32-Bit-Anaconda laufen ich ValueError: negative dimensions are not allowed

EDIT:

Das ganze Problem aus der Lösung ergab sich geben hier: Value Error: negative dimensions are not allowed when merging

+0

Versuchen Sie, Ihre letzten beiden Zeilen aus beiden 'for' Schleifen zu verwenden. Bei Ihrem obigen Code, in der letzten Iteration verbinden Sie Ihre erste Datenmenge so oft wie die Anzahl der Dateien, die Sie haben ... – ragesz

+0

Sorry, aber immer noch ziemlich neu zu Python, durch 'out' meinst du die letzten zwei Zeilen sollten ausgekleidet werden mit meinem ersten 'if'? –

Antwort

2

EDITED basierend auf Kommentar :

Versuchen Sie es (es ist genug, nur eine if Anweisung mit logischenzu verwendenBedingungen):

import os 
import pandas as pd 
from simpledbf import Dbf5 

folders = r'F:\dbf_tables' 
out = r'F:\merged' 

if not os.path.isdir(out): 
    os.mkdir(out) 

for folder in os.listdir(folders): 
    if not os.path.isdir(os.path.join(out, folder)): 
     os.mkdir(os.path.join(out, folder)) 

    # Initialize empty dataframe by folders 
    dfs = pd.DataFrame(columns=['POINTID']) 

    for f in os.listdir(os.path.join(folders, folder)): 
     if ('.xml' not in f) and ('.cpg' not in f): 
      table = Dbf5(os.path.join(folders, folder, f)) 
      df = table.to_dataframe() 

      # Merge actual dataframe to result dataframe 
      dfs = dfs.merge(df, on=['POINTID'], how='outer') 

    # Save results by folder 
    dfs.to_csv(os.path.join(out, folder, 'combined.csv'), index=False) 
+0

Ich bin neugierig, warum der erste Fall zu einem Speicherfehler führte und die Antwort nicht? – dartdog

+0

Ich denke, sie erklärten in einem Kommentar zum ursprünglichen Beitrag, es macht es so oft wie die Anzahl der Dateien beizutreten, anstatt nur einmal pro Ordner –

+0

tatsächlich, der Speicherfehler kam immer noch, es dauerte nur eine Stunde, dies zu tun, aber diesmal war mein Widder eigentlich voll. –