2016-10-07 3 views
0

私はバッファを持っており、一定のサイズを超えないようにする必要があります。私がしたら、バッファにファイルを追加して空にしたいと思います。番号比較が遅すぎる場合

マイコード:

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文全体をコメントアウトしました。

したがって、バッファを保持する効率的な方法はありますか?

+1

Iは ''代わりsys.getsizeof(self.b) 'の'でlen(self.b)を使用することを示唆しています。 'self.b'は単純な文字列なので、そのサイズを取得するのは簡単で高速です。ただし、文字列に追加する文字列は、文字列のメモリを再割り当てする必要があり、4 GBを再割り当てする必要があることが多いため、文字列に追加するのは時間がかかることに注意してください。 –

+0

buffer.append(s)を 'my_global_buffer + = s'に変更して最後にファイルに出力すると、実行はまだ1秒未満です。したがって、バッファ自体に追加するとは思いません遅い部分です。 – emihir0

+0

@ emihir0 CPythonは特定のケースでバッファへの追加を最適化できます。あなたのケースで可能かどうかを判断するのはちょっと難しいことです。これは、追加する文字列の参照カウントに依存します。 –

答えて

1

質問の編集に基づいて回答を元に戻して編集する。

比較が遅いと仮定するのは間違いです。実際、比較は高速です。本当に、本当に速い。

バッファリングされたIOを使用してホイールを再発明するのはなぜですか?

オプションのバッファリング引数は、ファイルのバッファサイズを指定します.0はバッファなし、1はラインバッファリング、その他の正の値は(およそ)そのサイズ(バイト)のバッファを使用することを意味します。負のバッファリングとは、システムのデフォルトを使用することを意味します。通常、ttyデバイス用にはラインバッファーが使用され、他のファイル用には完全にバッファーされます。省略すると、システムのデフォルトが使用されます。 [2]

https://docs.python.org/2/library/functions.html#open

+0

私は従うことができません。 'sys.getsizeof()'の速度は文字列のサイズに依存するのはなぜですか? –

+0

@ e4c5 sys.getsizeof(self.b)を印刷してメソッドの残りの部分をコメントアウトしても、1秒未満で実行されるため、バッファのサイズが高価ではないと思っていました。比較。 – emihir0

+0

私は間違った結論にジャンプしました@SvenMarnach – e4c5

関連する問題