سؤال

أنا على خادم مشترك مع مساحة قرص مقيدة ولدي ملف GZ يتوسع Super إلى ملف ضخم ، أكثر مما لدي. كيف يمكنني استخراج "جزء" بواسطة "جزء" (دعنا نقول 10 ميغابايت في كل مرة) ، ومعالجة كل جزء ، دون استخراج كل شيء حتى مؤقتًا!

لا ، هذا مجرد ملف مضغوط ضخم واحد ، وليس مجموعة من الملفات من فضلك ...


مرحبًا David ، يبدو الحل الخاص بك أنيقًا تمامًا ، لكن إذا كنت أستعد له بشكل صحيح ، فيبدو أنه في كل مرة يستخلص Gunzip من بداية الملف (وإخراج ذلك). أنا متأكد من أنه سيتسبب في ضغط كبير على الخادم المشترك الذي أنا عليه (لا أعتقد أن "القراءة إلى الأمام" على الإطلاق) - هل لديك أي رؤى حول كيفية جعل Gunzip "تخطي" الرقم اللازم من الكتل؟

هل كانت مفيدة؟

المحلول

إذا كنت تفعل ذلك باستخدام أدوات Shell (UNIX/Linux) ، فيمكنك استخدامها gunzip -c لإلغاء الضغط على stdout ، ثم استخدم dd مع ال skip و count خيارات لنسخ قطعة واحدة فقط.

فمثلا:

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

ثم تخطي = 1 ، تخطي = 2 ، إلخ.

نصائح أخرى

لسوء الحظ ، لا أعرف أمر UNIX موجود يفعل بالضبط ما تحتاجه. يمكنك القيام بذلك بسهولة مع برنامج صغير بأي لغة ، على سبيل المثال في بيثون ، 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 بالضبط مليون بايت ، تخطي أول 4 ملايين بايت في التيار غير المضغوط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top