Pythonメモリエラー(4つの解決策)



Python Memory Error



昨日、Pycharmで200 + M CSVを読み取る過程で、メモリエラーが発生しました!偽のコンピューターを買ったのではないかと疑われました。結局のところ、それは8Gメモリi7プロセッサでした。私はかつて、偽のメモリモジュールを持っているのではないかと疑っていました。 。 。 。いくつかのトラブルシューティング手順について説明しましょう。 。 。 。通常、以下の方法を使用し、順番に試してください。

まず、1行ずつ読みます
pd.read_csvを使用してファイルを読み取ると、データが一度にメモリに読み込まれ、メモリがバーストします。次に、それを1行ずつ読むというアイデアがあります。コードは次のとおりです。



data = [] with open(path, 'r',encoding='gbk',errors='ignore') as f: for line in f: data.append(line.split(',')) data = pd.DataFrame(data[0:100])


これは、最初にcsvの各行を開いた文字列に読み取るためです。次に、csvは各列のデータをコンマ区切りで区切るため、コンマで分割できます。列を分離し、各行のリストをリストに入れ、2次元配列を形成してから、DataFrameに変換します。

この方法にはいくつかの問題があります。読み込んだ後、インデックス名と列名を再調整する必要があります。第二に、多くの種類の数字が文字列に変更されました。最後に、最後の列には改行文字が含まれます。それらをreplaceに置き換える必要があります。もうやめろ。



この操作を使用した後も、メモリエラーの問題が発生する理由はわかりません。これらの欠点とレガシーの問題に基づいて、2番目の解決策を検討してください。

次に、パンダでread_csvのブロック読み取り機能を使用します
パンダはこれらの考えられる問題を念頭に置いて設計されているはずなので、ブロック読み取り関数は読み取り関数で設計されました。つまり、すべてのデータが一度に配置されるわけではありません。メモリに移動しますが、ブロックをメモリに読み込み、最後にブロックをマージして完全なDataFrameを形成します。

f = open(path) data = pd.read_csv(path, sep=',',engine = 'python',iterator=True) loop = True chunkSize = 1000 chunks = [] index=0 while loop: try: print(index) chunk = data.get_chunk(chunkSize) chunks.append(chunk) index+=1 except StopIteration: loop = False print('Iteration is stopped.') Print('start merge') data = pd.concat(chunks, ignore_index= True)


上記のコードは、イテレータがブロックを読み取ることを指定し、各ブロックのサイズ、chunkSizeを指定します。これは、各ブロックに含まれる行数を指定します。



このメソッドはデータのタイプを維持でき、列名とインデックスの調整について心配する必要はありません。しかし残念ながら、私はまだこの問題を抱えています。この方法またはメモリエラーを使用する場合は、引き続き見下ろすことができます。

第三に、仮想メモリを拡張します
コードの実行中に、メモリエラーが発生したとき、メモリが40%以上しか使用していないことがわかったため、このエラーが発生する可能性は低いため、メモリが制限されていることを確認しました。一部をオフにすることを検討してください。メモリを制限したり、仮想メモリを拡張したりする可能性のあるソフトウェア、これら。

仮想メモリを拡張する方法(私のシステムはwin8ですが、似ているはずです):
1.コントロールパネルを開きます。
2、システムを見つける
3.システムの詳細設定を見つけます。
4.パフォーマンスモジュールの[設定]ボタンをクリックします。
5.詳細パネルを選択し、仮想メモリモジュールの[変更]をクリックします。
6. [すべてのドライブのページングファイルサイズを自動的に管理する]を選択しないでください。次に、ディスクであるドライブを選択し、カスタムサイズを選択し、初期サイズと最大値を手動で入力します。もちろん、そうしないことをお勧めします。大きすぎる。変更後は、ディスクの使用状況を確認でき、スペースをあまり失うことはありません。
7.設定後、必ず「設定」をクリックして確認してください。そうしないと無効になり、最後にコンピュータを再起動します。

悲劇は、このステップを設定した後も、まだメモリエラーが発生していることです。このステップで問題がなければ、次の解決策を検討する必要はありません。それでも問題が解決しない場合は、それを確認できます。

第4に、PandasライブラリとNumpyライブラリを64ビットに更新します
Pythonが32ビットを使用している場合、パンダとNumpyは32ビットのみになり、メモリ使用量が2Gを超えると、メモリが自動的に終了します。 。このエラーを見つけたのは、メモリオーバーフローエラーを報告したときに、メモリに40%以上しか表示されておらず、エラーメッセージがパンダのコアにあることに気付いたためです。確認したところ、まだ非常に大きなものがあることがわかりました。 1。ピット。

解決策は次のとおりです。最初にPythonのビット数を確認し、シェルにpythonと入力し、ビット数を表示します(32ビットの場合)。次にPythonをリロードし、64ビットをインストールしますが、同時にライブラリに必要なものがあります。再インストールする必要があります。しかし、この手順を実行した後、問題は完全に解決されました。

5、まだメモリオーバーフローエラーがある場合
上記の4つの方法を1つずつ順番に使用し、エラーが消えるステップを停止することができます。もちろん、メモリディスプレイの使用量が99%以上に達した場合、メモリは実際には十分ではありません。問題ありません。 Pythonにはガベージコレクションがありますが、大量のデータでない場合は、コードを作成する際の通常の問題です。メカニズムですが、特にループ反復のプロセスでは、リサイクルするのに遅すぎない場合があります。ガベージが収集される前に完了することが多いため、不要な変数を時間内に削除するか、gcガベージコレクションライブラリを使用することを忘れないでください。記憶は自然です常にクリアでさわやかです〜

オリジナル:https://blog.csdn.net/weixin_39750084/article/details/81501395