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
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
Sorry, aber immer noch ziemlich neu zu Python, durch 'out' meinst du die letzten zwei Zeilen sollten ausgekleidet werden mit meinem ersten 'if'? –