私はバッファを持っており、一定のサイズを超えないようにする必要があります。私がしたら、バッファにファイルを追加して空にしたいと思います。番号比較が遅すぎる場合
マイコード:
import sys
MAX_BUFFER_SIZE = 4 * (1024 ** 3)
class MyBuffer(object):
b = ""
def append(self, s):
if sys.getsizeof(self.b) > MAX_BUFFER_SIZE:
#...print to file... empty buffer
self.b = ""
else:
self.b += s
buffer = MyBuffer()
for s in some_text:
buffer.append(s)
しかし、この比較(sys.getsizeof(self.buffer) > MAX_BUFFER_SIZE
は)(。すなわち、比較せずに、全体の実行は、それが5分のようになります比較して、1秒未満かかります)あまりにも遅いです。
現時点ではsome_string
全体をメモリに収めることができるので、バッファは実際にはMAX_BUFFER_SIZE
より大きくなることはありませんが、巨大なファイル(数TB)でも動作することを確認する必要があります。
編集:
このコードは、1秒の下で実行されます:
import sys
buffer = ""
for s in some_text:
buffer += s
#print out to file
問題は、バッファが大きすぎるになるかもしれないということです。
同様に、このコードはまた、第1の下で実行されます:
import sys
MAX_BUFFER_SIZE = 4 * (1024 ** 3)
class MyBuffer(object):
b = ""
def append(self, s):
print sys.getsizeof(self.b)
buffer = MyBuffer()
for s in some_text:
buffer.append(s)
EDIT 2:
申し訳ありませんが、遅い部分は、実際にバッファに追加されている、いない比較自体私は考えています。私がコードをテストしていたとき、私は最初の部分の代わりにif/else
文全体をコメントアウトしました。
したがって、バッファを保持する効率的な方法はありますか?
Iは ''代わりsys.getsizeof(self.b) 'の'でlen(self.b)を使用することを示唆しています。 'self.b'は単純な文字列なので、そのサイズを取得するのは簡単で高速です。ただし、文字列に追加する文字列は、文字列のメモリを再割り当てする必要があり、4 GBを再割り当てする必要があることが多いため、文字列に追加するのは時間がかかることに注意してください。 –
buffer.append(s)を 'my_global_buffer + = s'に変更して最後にファイルに出力すると、実行はまだ1秒未満です。したがって、バッファ自体に追加するとは思いません遅い部分です。 – emihir0
@ emihir0 CPythonは特定のケースでバッファへの追加を最適化できます。あなたのケースで可能かどうかを判断するのはちょっと難しいことです。これは、追加する文字列の参照カウントに依存します。 –