リストのメモリの一部をpythonで解放するにはどうしたらいいですか? は、私は次のようにそれを行うことができます:Pythonで空きメモリを明示的に強制するにはどうすればいいですか?
del list[0:j]
または単一リストノード用:
del list[j]
マーク:私のスクリプトは、巨大なリストを分析し、私はすぐにメモリ割り当て解除を必要とする理由である巨大な出力を作成します。
リストのメモリの一部をpythonで解放するにはどうしたらいいですか? は、私は次のようにそれを行うことができます:Pythonで空きメモリを明示的に強制するにはどうすればいいですか?
del list[0:j]
または単一リストノード用:
del list[j]
マーク:私のスクリプトは、巨大なリストを分析し、私はすぐにメモリ割り当て解除を必要とする理由である巨大な出力を作成します。
あなたはPythonで手動本当に空きメモリことはできません。
del
を使用すると、オブジェクトの参照カウントが減少します。その参照カウントがゼロになると、ガベージコレクタの実行時にオブジェクトが解放されます。
del
の後に手動でgc.collect()
を実行するのが最善の方法です。
このような場合は、通常、アルゴリズムを変更してみることをおすすめします。たとえば、Thijsがコメント内に示唆するように、リストの代わりにジェネレータを使用します。
もう一つの戦略は、ハードウェアを問題に投げることです(RAMを増やす)。しかし、これには一般的に財政的および技術的限界があります。 :-)
あなたは(collections.deque
含む)4つの一般的な方法を経由して、リスト内の項目を削除することができます。
リストのremove()メソッド:
削除は、最初に一致した値ではなく、特定のインデックス
を削除します覚えていますこのメソッドは値を返しませんが、指定されたオブジェクトをリストから削除します。
例:
list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
list_1.remove('abc')
print(list_1)
list_1.remove('total')
print(list_1)
出力:
[987, 'total', 'cpython', 'abc']
[987, 'cpython', 'abc']
第二の方法は、リスト・デル()メソッド
あなたがここにindex_no
を指定する必要があります出力:
[987, 'total', 'cpython', 'abc']
[987, 'total', 'cpython']
3つ目は、リストポップ()メソッドである:
ポップ()削除し、リスト内の最後の項目を返します。
list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
list_1.pop()
print(list_1)
list_1.pop()
print(list_1)
list_1.pop()
print(list_1)
出力:
[987, 'abc', 'total', 'cpython']
[987, 'abc', 'total']
[987, 'abc']
フォース方法はcollections.dequeある
のようないくつかのより多くの外部モジュールの方法があります
あなたはから値をポップすることができますが両端キューの両側:
from collections import deque
d = deque()
d.append('1')
d.append('2')
d.append('3')
print(d)
d.popleft()
print(d)
d.append('1')
print(d)
d.pop()
print(d)
出力:
deque(['1', '2', '3'])
deque(['2', '3'])
deque(['2', '3', '1'])
deque(['2', '3'])
指定されたすべてのメソッドがメモリを解放しますか?私のスクリプトは巨大なリストを分析し、膨大な出力を生成するので、実行時の割り当て解除を確実にしなければならないので、私は尋ねています。 – David
@David 'deque'は本質的にリンクされたリストなので、通常のリストはメモリ内で連続しており、要素の数が半分または2倍になると再割り当てされます(概算)。それまでは、メモリ使用量は変わりません。さらに悪いことに、再割り当て操作自体は、新しいリストと同じくらい多くのメモリを必要とします。これは、古いものがコピーされるまでクリーンアップできないためです。リンクされたリストも理想的ではないことに注意してください。例えば、それは要素当たりより多くのメモリを必要とし、索引付け操作は比較的高価である。 –
最初の 'j'は' list'から削除されます。 2番目のアイテムは_j + 1_番目のアイテムを削除します。 – mshsayem
あなたは何を達成しようとしていますか? –
おそらく、ジェネレータを使用して、オンザフライで必要なフィルタリングを行うパイプラインを作成する方が良いでしょうか? –