소스 검색

Better buffer handling.

Jonas Borgström 15 년 전
부모
커밋
b1cf8b161c
1개의 변경된 파일13개의 추가작업 그리고 15개의 파일을 삭제
  1. 13 15
      dedupstore/chunkifier.py

+ 13 - 15
dedupstore/chunkifier.py

@@ -40,9 +40,11 @@ class ChunkifyIter(object):
         self.full_sum = True
         self.full_sum = True
         self.extra = None
         self.extra = None
         self.done = False
         self.done = False
+        self.buf_size = self.chunk_size * 3
         return self
         return self
 
 
     def next(self):
     def next(self):
+        o = 0
         if self.done:
         if self.done:
             raise StopIteration
             raise StopIteration
         if self.extra:
         if self.extra:
@@ -51,7 +53,7 @@ class ChunkifyIter(object):
         while True:
         while True:
             if len(self.data) - self.i < self.chunk_size:
             if len(self.data) - self.i < self.chunk_size:
                 self.data += self.fd.read(self.chunk_size * 3)
                 self.data += self.fd.read(self.chunk_size * 3)
-            if not self.data:
+            if len(self.data) == self.i:
                 raise StopIteration
                 raise StopIteration
             if self.full_sum or len(self.data) - self.i < self.chunk_size:
             if self.full_sum or len(self.data) - self.i < self.chunk_size:
                 self.sum = checksum(self.data[self.i:self.i + self.chunk_size])
                 self.sum = checksum(self.data[self.i:self.i + self.chunk_size])
@@ -62,29 +64,25 @@ class ChunkifyIter(object):
                                          self.chunk_size)
                                          self.chunk_size)
                 self.remove = self.data[self.i]
                 self.remove = self.data[self.i]
             if len(self.data) - self.i < self.chunk_size:  # EOF?
             if len(self.data) - self.i < self.chunk_size:  # EOF?
-                if len(self.data) > self.chunk_size:
+                if o > 0:
                     self.extra = self.data[-self.chunk_size:]
                     self.extra = self.data[-self.chunk_size:]
-                    return self.data[:len(self.data) - self.chunk_size]
+                    return self.data[-self.chunk_size - o + 1:-self.chunk_size]
                 else:
                 else:
                     self.done = True
                     self.done = True
-                    return self.data
+                    return self.data[self.i:]
             elif self.sum in self.chunks:
             elif self.sum in self.chunks:
-                if self.i > 0:
-                    chunk = self.data[:self.i]
-                    self.data = self.data[self.i:]
+                if o > 0:
+                    chunk = self.data[self.i - o:self.i]
                 else:
                 else:
-                    chunk = self.data[:self.chunk_size]
-                    self.data = self.data[self.chunk_size:]
+                    chunk = self.data[self.i:self.i + self.chunk_size]
+                    self.i += self.chunk_size
                 self.full_sum = True
                 self.full_sum = True
-                self.i = 0
-                return chunk
-            elif self.i == self.chunk_size:
-                chunk = self.data[:self.chunk_size]
-                self.data = self.data[self.chunk_size:]
-                self.i = 0
                 return chunk
                 return chunk
+            elif o == self.chunk_size:
+                return self.data[self.i-self.chunk_size:self.i]
             else:
             else:
                 self.i += 1
                 self.i += 1
+                o += 1
 
 
 
 
 def chunkify(fd, chunk_size, chunks):
 def chunkify(fd, chunk_size, chunks):