作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我创建一个文件,使用 lseek(2)
跳转到(空)文件中的较高位置,然后在那里写一些有值(value)的信息,我在 Unix 系统上创建一个稀疏文件(可能取决于我使用的文件系统,但假设我使用的是典型的 Unix 文件系统像 ext4 或类似的,就是这种情况)。
如果我那么 lseek(2)
到文件中更高的位置,也在那里写一些东西,我最终得到一个稀疏文件,其中包含有值(value)的信息,被大量稀疏文件包围。我想在文件中找到这些有值(value)的信息,而不必完全阅读它。
例子:
$ python
f = open('sparse', 'w')
f.seek((1<<40) + 42)
f.write('foo')
f.seek((1<<40) * 2)
f.write('\0')
f.close()
$ du -h sparse
8.0K sparse
foo
)。
cat sparse
找到它当然,但这将读取完整的文件并打印大量的零字节。我尝试了较小的尺寸,发现这种方法需要大约 3 小时才能在我的电脑上打印三个字符。
最佳答案
只是根据之前的评论写一个答案:
#!/usr/bin/env python3
from errno import ENXIO
from os import lseek
from sys import argv, stderr
SEEK_DATA = 3
SEEK_HOLE = 4
def get_ranges(fobj):
ranges = []
end = 0
while True:
try:
start = lseek(fobj.fileno(), end, SEEK_DATA)
end = lseek(fobj.fileno(), start, SEEK_HOLE)
ranges.append((start, end))
except OSError as e:
if e.errno == ENXIO:
return ranges
raise
def main():
if len(argv) < 2:
print('Usage: %s <sparse_file>' % argv[0], file=stderr)
raise SystemExit(1)
try:
with open(argv[1], 'rb') as f:
ranges = get_ranges(f)
for start, end in ranges:
print('[%d:%d]' % (start, end))
size = end-start
length = min(20, size)
f.seek(start)
data = f.read(length)
print(data)
except OSError as e:
print('Error:', e)
raise SystemExit(1)
if __name__ == '__main__': main()
SEEK_DATA and SEEK_HOLE are nonstandard extensions also present in Solaris, FreeBSD, and DragonFly BSD; they are proposed for inclusion in the next POSIX revision (Issue 8).
关于python - 稀疏文件 : How to find contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46100881/
我是一名优秀的程序员,十分优秀!