mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Merged revisions 88528 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r88528 | lars.gustaebel | 2011-02-23 12:42:22 +0100 (Wed, 23 Feb 2011) | 16 lines Issue #11224: Improved sparse file read support (r85916) introduced a regression in _FileInFile which is used in file-like objects returned by TarFile.extractfile(). The inefficient design of the _FileInFile.read() method causes various dramatic side-effects and errors: - The data segment of a file member is read completely into memory every(!) time a small block is accessed. This is not only slow but may cause unexpected MemoryErrors with very large files. - Reading members from compressed tar archives is even slower because of the excessive backwards seeking which is done when the same data segment is read over and over again. - As a backwards seek on a TarFile opened in stream mode is not possible, using extractfile() fails with a StreamError. ........
This commit is contained in:
parent
dcb29c93d2
commit
9f6cbe09cc
3 changed files with 22 additions and 3 deletions
|
@ -760,9 +760,8 @@ class _FileInFile(object):
|
|||
self.map_index = 0
|
||||
length = min(size, stop - self.position)
|
||||
if data:
|
||||
self.fileobj.seek(offset)
|
||||
block = self.fileobj.read(stop - start)
|
||||
buf += block[self.position - start:self.position + length]
|
||||
self.fileobj.seek(offset + (self.position - start))
|
||||
buf += self.fileobj.read(length)
|
||||
else:
|
||||
buf += NUL * length
|
||||
size -= length
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue