GUNZIP /“逐部分”提取文件

发布于 2024-09-01 08:43:41 字数 285 浏览 6 评论 0原文

我在一个磁盘空间有限的共享服务器上,并且我有一个 gz 文件,它可以超级扩展为一个巨大的文件,比我拥有的还要多。我怎样才能“部分”地提取它(假设一次10MB),并处理每个部分,甚至暂时不提取整个内容!

不,这只是一个超级巨大的压缩文件,而不是一组文件请...


嗨大卫,你的解决方案看起来非常优雅,但如果我准备得正确,似乎每次gunzip都会从文件的开头提取(并且我确信它的输出会被丢弃)。这将对我所在的共享服务器造成巨大的压力(我根本不认为它是“预读”)-您对如何使gunzip“跳过”必要数量的块有任何见解吗?

I'm on a shared server with restricted disk space and i've got a gz file that super expands into a HUGE file, more than what i've got. How can I extract it "portion" by "portion (lets say 10 MB at a time), and process each portion, without extracting the whole thing even temporarily!

No, this is just ONE super huge compressed file, not a set of files please...


Hi David, your solution looks quite elegant, but if i'm readying it right, it seems like every time gunzip extracts from the beginning of the file (and the output of that is thrown away). I'm sure that'll be causing a huge strain on the shared server i'm on (i dont think its "reading ahead" at all) - do you have any insights on how i can make gunzip "skip" the necessary number of blocks?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧话新听 2024-09-08 08:43:41

如果您使用 (Unix/Linux) shell 工具执行此操作,则可以使用 gunzip -c 解压缩到 stdout,然后使用 ddskip< /code> 和 count 选项仅复制一个块。

例如:

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

则skip=1、skip=2等。

If you're doing this with (Unix/Linux) shell tools, you can use gunzip -c to uncompress to stdout, then use dd with the skip and count options to copy only one chunk.

For example:

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

then skip=1, skip=2, etc.

苹果你个爱泡泡 2024-09-08 08:43:41

不幸的是,我不知道现有的 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))

现在gunzipFifthone 将在文件 fifthone 中放入正好一百万个字节,跳过未压缩流中的前 400 万个字节。

Unfortunately I don't know of an existing Unix command that does exactly what you need. You could do it easily with a little program in any language, e.g. in Python, cutter.py (any language would do just as well, of course):

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))

Now gunzip <huge.gz | python cutter.py 1000000 5 > fifthone will put in file fifthone exactly a million bytes, skipping the first 4 million bytes in the uncompressed stream.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文