2016-04-27 17 views
0

Ich arbeite in Python2.7 (Anaconda 4.0) auf einem Jupyter Notebook auf einer EC2-Instanz mit viel Speicher (60GB, 48GB frei nach free). Ich habe einen Pandas (v0.18) -Datenrahmen geladen, der groß ist (150K Zeilen, ~ 30KB pro Zeile), aber ist nicht annähernd die Speicherkapazität der Instanz, selbst wenn viele viele Kopien erstellt werden. Bestimmte Pandas und Scikit-Learn (v0.17) Anrufe ein Memory auslösen sofort, zB:Pandas/Sklearn gibt falschen Memoryerror

#X is a subset of the original df with 60 columns instead of the 3000 
#Y is a float column 
X.add(Y) 

#And for sklearn... 
pca = decomposition.KernelPCA(n_components=5) 
pca.fit(X,Y) 

Inzwischen diese funktionieren:

Z = X.copy(deep=True) 
pca = decomposition.PCA(n_components=5) 

meisten verblüffend, ich kann dies tun, und es endet in wenigen Sekunden:

huge = range(1000000000) 

habe ich das Notebook neu gestartet, den Kernel und die Instanz, aber die gleichen Anrufe die MemoryError immer geben. Ich habe auch überprüft, dass ich 64-Bit Python verwende. Irgendwelche Vorschläge?

Update: Hinzufügen der Zurückverfolgungsfehler:

Traceback (most recent call last): 
    File "<ipython-input-9-ae71777140e2>", line 2, in <module> 
    Z = X.add(Y) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/ops.py", line 1057, in f 
    return self._combine_series(other, na_op, fill_value, axis, level) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 3500, in _combine_series 
    fill_value=fill_value) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 3528, in _combine_match_columns 
    copy=False) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 2730, in align 
    broadcast_axis=broadcast_axis) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 4152, in align 
    fill_axis=fill_axis) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 4234, in _align_series 
    fdata = fdata.reindex_indexer(join_index, lidx, axis=0) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 3528, in reindex_indexer 
    fill_tuple=(fill_value,)) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 3591, in _slice_take_blocks_ax0 
    fill_value=fill_value)) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 3621, in _make_na_block 
    block_values = np.empty(block_shape, dtype=dtype) 
MemoryError 

und

Traceback (most recent call last): 
    File "<ipython-input-13-d510bc16443e>", line 3, in <module> 
    pca.fit(X,Y) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/kernel_pca.py", line 202, in fit 
    K = self._get_kernel(X) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/kernel_pca.py", line 135, in _get_kernel 
    filter_params=True, **params) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/sklearn/metrics/pairwise.py", line 1347, in pairwise_kernels 
    return _parallel_pairwise(X, Y, func, n_jobs, **kwds) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/sklearn/metrics/pairwise.py", line 1054, in _parallel_pairwise 
    return func(X, Y, **kwds) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/sklearn/metrics/pairwise.py", line 716, in linear_kernel 
    return safe_sparse_dot(X, Y.T, dense_output=True) 
    File "/home/ec2-user/anaconda2/lib/python2.7/site-packages/sklearn/utils/extmath.py", line 184, in safe_sparse_dot 
    return fast_dot(a, b) 
MemoryError 
+0

Dinge können groß in sklearn wachsen. Was zeigt 'htop', wenn der Fitting tatsächlich läuft? – reptilicus

+0

können Sie eine vollständige Stapelverfolgung einfügen? – reptilicus

+0

Es zeigt den Python-Prozess überhaupt nicht. Als ich die Milliardenliste anrief, begann sie, die CPU aufzufressen und allmählich mehr Speicher zu verwenden. Aber diese Operationen machen nicht einmal einen Blip, und sie treffen den Fehler, sobald ich sie ausführe. – Bob

Antwort

0

die Pandas Seite des Problems herausgefunden. Ich hatte einen DF und eine Serie mit Indizes passende, X und Y. Ich dachte, ich Y als eine andere Spalte wie folgt hinzufügen könnte:

X.add(Y) 

Aber dies zu tun versucht, Y übereinstimmen, auf den Säulen, nicht auf dem Index, So entsteht ein 150Kx150K-Array. Ich musste die Achse liefern:

X.add(Y, axis='index') 
Verwandte Themen