我在具有限制磁盘空间的共享服务器上,并且我有一个超级扩展到一个巨大文件的GZ文件,比我拥有的更多。如何通过“部分”(一次性地说10 MB)提取它,并处理每个部分,而无需暂时提取整个内容!

不,这只是一个超大的压缩文件,而不是一组文件。


嗨,大卫,您的解决方案看起来很优雅,但是如果我准备正确的问题,似乎每次Gunzip从文件开头提取时(以及将其输出丢弃)。我敢肯定,这会对我使用的共享服务器产生巨大的压力(我认为它的“阅读”根本不会) - 您对如何使Gunzip“跳过”必要的数字有任何见解块?

有帮助吗?

解决方案

如果您使用(UNIX/Linux)Shell工具执行此操作,则可以使用 gunzip -c 要解压缩到stdout,然后使用 ddskipcount 仅复制一个块的选项。

例如:

gunzip -c input.gz | dd bs=10485760 skip=0 count=1 >output

然后跳过= 1,跳过= 2,等。

其他提示

不幸的是,我不知道现有的UNIX命令可以正是您需要的。您可以使用任何语言的小程序轻松地做到这一点,例如,在Python中, cutter.py (当然,任何语言也会做得同样):

import sys
try:
  size = int(sys.argv[1])
  N = int(sys.argv[2])
except (IndexError, ValueError):
  print>>sys.stderr, "Use: %s size N" % sys.argv[0]
  sys.exit(2)
sys.stdin.seek((N-1) * size)
sys.stdout.write(sys.stdin.read(size))

现在 gunzip <huge.gz | python cutter.py 1000000 5 > fifthone 将归档 fifthone 恰好一百万个字节,跳过了未压缩流中的前400万字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top