كيف يمكنك ربط ملفين ضخمين بمساحة قرص صغيرة جدًا؟[مغلق]

StackOverflow https://stackoverflow.com/questions/290700

سؤال

لنفترض أن لديك ملفين ضخمين (عدة غيغابايت) تريد ربطهما معًا، ولكن لديك مساحة صغيرة جدًا على القرص (على سبيل المثال، بضع مئات من ميغابايت).وهذا هو، نظرا file1 و file2, ، تريد أن ينتهي بك الأمر بملف واحد نتيجة التسلسل file1 و file2 معًا بايت مقابل بايت، وحذف الملفات الأصلية.

لا يمكنك أن تفعل ما هو واضح cat file2 >> file1; rm file2, ، لأنه بين العمليتين، ستنفد مساحة القرص.

نرحب بالحلول المتوفرة على أي وجميع المنصات التي تحتوي على أدوات مجانية أو غير مجانية؛هذه مشكلة افتراضية خطرت ببالي عندما كنت أقوم بتنزيل Linux ISO في أحد الأيام، وانقطع التنزيل جزئيًا بسبب عطل في الشبكة اللاسلكية.

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

المحلول

أعتقد أن الصعوبة تكمن في تحديد كيفية استرداد المساحة من الملفات الأصلية.

أعتقد أن ما يلي قد ينجح:

  1. تخصيص ملف متفرق الحجم المشترك.
  2. انسخ 100 ميجابايت من نهاية الملف الثاني إلى نهاية الملف الجديد.
  3. اقتطاع 100 ميجابايت من نهاية الملف الثاني
  4. قم بالتكرار 2&3 حتى تنتهي من الملف الثاني (مع 2.تم تعديله إلى المكان الصحيح في الملف الوجهة).
  5. افعل 2&3&4 ولكن مع الملف الأول.

يعتمد كل هذا على دعم الملفات المتفرقة، وتحرير مساحة اقتطاع الملفات على الفور.

إذا كنت تريد فعلاً القيام بذلك، فيجب عليك التحقيق في الأمر dd يأمر.والتي يمكن أن تفعل خطوة النسخ

قدم شخص ما في إجابة أخرى حلاً أنيقًا لا يتطلب ملفات متفرقة، ولكنه ينسخ file2 مرتين:

  1. انسخ أجزاء بحجم 100 ميجابايت من نهاية الملف 2 إلى ملف جديد 3، وينتهي الأمر بترتيب عكسي.اقتطاع الملف 2 كما تذهب.
  2. انسخ قطعًا بحجم 100 ميجا بايت من نهاية الملف 3 إلى الملف 1، وانتهى بالقطع بترتيبها الأصلي، في نهاية الملف 1.اقتطاع الملف 3 كما تذهب.

نصائح أخرى

الوقت المستغرق في اكتشاف حل ذكي يتضمن خلط قطاع القرص ومعالجة سلسلة الملفات:2-4 ساعات

الوقت المستغرق في الحصول على/كتابة البرنامج لإجراء النسخ والاقتطاع في مكانه:2-20 ساعة

مرات متوسط ​​معدل المبرمج 50 دولارًا في الساعة:400 دولار - 1200 دولار

تكلفة محرك أقراص USB سعة 1 تيرابايت:100 دولار - 200 دولار

القدرة على فهم عبارة "تكلفة الفرصة البديلة":لا يقدر بثمن

وهنا تحسن طفيف على بلدي <لأ href = "https://stackoverflow.com/questions/290700/how-can-you-concatenate-two-huge-files-with-very-little-spare-disk- الفضاء # 290788 "> الجواب أولا .

إذا كان لديك 100MB مجانا، نسخ 100MB الماضي من الملف الثاني وإنشاء ملف ثالث. اقتطاع الملف الثاني بحيث يتم 100MB الآن أصغر. كرر هذه العملية حتى يتم متحللة الملف الثاني تماما إلى قطع 100MB الفردية.

والآن كل من هذه الملفات 100MB يمكن إلحاق الملف الأول، في وقت واحد.

ومع تلك القيود وأتوقع كنت بحاجة للعبث مع نظام الملفات. تعديل مباشرة حجم وتوزيع كتل الملف.

وبعبارة أخرى، ونسيان خلط أي كتل من محتوى الملف حولها، ومجرد تعديل المعلومات حول تلك الملفات.

وإذا كان الملف هو انضغاط عالية (أي السجلات.):

gzip file1

gzip file2

zcat file1 file2 | gzip > file3

rm file1

rm file2

gunzip file3

وفي خطر السبر وقح، هل تعتبر الخيار من مجرد الحصول على قرص أكبر؟ ومن المحتمل أن يكون أسرع ...

وليس فعالة جدا، ولكن أعتقد أنه يمكن القيام به.

وافتح الملف الأول في وضع إلحاق، ونسخ كتل من الملف الثاني لأنه حتى القرص بالكامل تقريبا. للفترة المتبقية من الملف الثاني، نسخ كتل من النقطة التي توقف عندها العودة إلى بداية الملف عن طريق الوصول العشوائي I / O. اقتطاع الملف بعد الانتهاء من نسخ كتلة الماضي. كرر حتى الانتهاء.

ومن الواضح أن الجواب الاقتصادية شراء المزيد من التخزين على افتراض أن لإجابة ممكنة. قد لا يكون، على الرغم - نظام مضمن مع أي وسيلة لتوصيل مزيد من التخزين، أو حتى لا تستطيع الوصول إلى المعدات نفسها - أقول، مسبار الفضاء في رحلة

والجواب التي سبق عرضها على أساس نظام ملف متفرق جيدة (بخلاف الطبيعة المدمرة منه إذا حدث خطأ ما!) إذا كان لديك نظام ملف متفرق. ماذا لو لم تقم بذلك، على الرغم من؟

وابتداء من نهاية كتل نسخة ملف 2 إلى بداية الملف الهدف عكس لهم كما تذهب. بعد كل كتلة اقتطاع الملف المصدر إلى طول uncopied. كرر لملف # 1.

وعند هذه النقطة يحتوي الملف الهدف جميع البيانات الى الوراء، فقد ولت الملفات المصدر.

وقراءة كتلة من اذع ومن نهاية الملف الهدف، عكس لهم ويكتب لهم الى مكان الحادث جاء البعض منها. العمل طريقك التقليب الداخل الكتل.

عند الانتهاء الملف الهدف هو سلسلة من الملفات المصدر. لا يوجد نظام ملف متفرق حاجة، لا تعبث مع نظام الملفات المطلوبة. يمكن أن يتم ذلك في صفر بايت حرة حيث لا يمكن إجراء البيانات في الذاكرة.

حسنًا، للترفيه النظري، وفقط إذا وعدت بعدم إضاعة وقتك في فعل ذلك:

  • يتم تخزين الملفات على القرص في أجزاء
  • القطع مرتبطة في سلسلة

لذلك يمكنك ربط الملفات عن طريق:

  • ربط الجزء الأخير من الملف الأول بالجزء الأول من الملف الأخير
  • تغيير إدخال الدليل للملف الأول لتغيير الجزء الأخير وحجم الملف
  • إزالة إدخال الدليل للملف الأخير
  • تنظيف علامة نهاية الملف للملف الأول، إن وجدت
  • لاحظ أنه إذا كان الجزء الأخير من الملف الأول ممتلئًا جزئيًا فقط، فسيتعين عليك نسخ البيانات "لأعلى" أجزاء الملف الأخير لتجنب وجود بيانات غير صحيحة في منتصف الملف [شكرًا @Wedge!]

سيكون هذا فعالاً على النحو الأمثل:الحد الأدنى من التعديلات، الحد الأدنى من النسخ، لا توجد مساحة قرص احتياطية مطلوبة.

اذهب الآن لشراء محرك أقراص USB ؛-)

واثنين من الأفكار:

إذا كان لديك ما يكفي من الذاكرة RAM الفعلية، هل يمكن فعلا قراءة الملف الثاني تماما في الذاكرة، حذفه، ثم اكتبها في وضع إلحاق إلى الملف الأول. بالطبع إذا فقدت السلطة بعد حذف ولكن قبل الانتهاء من الكتابة، كنت قد فقدت جزءا من الملف الثاني من أجل الخير.

وبشكل مؤقت تقليل مساحة القرص المستخدمة من قبل وظائف نظام التشغيل (مثل الذاكرة الظاهرية، "سلة المهملات" أو ما شابه ذلك). ربما فقط لاستخدامها في ويندوز.

وأشك في هذا إجابة مباشرة على السؤال. يمكنك اعتبار ذلك وسيلة بديلة لحل المشكلة.

وأعتقد أنه من الممكن النظر في ملف 2ND كجزء 2 من الملف الأول. عادة في تطبيق البريدي، فإننا نرى يتم تقسيم ملف ضخم إلى أجزاء متعددة. إذا قمت بفتح الجزء الأول، فإن تطبيق تعتبر تلقائيا أجزاء أخرى في مزيد من المعالجة.

ويمكننا محاكاة الشيء نفسه هنا. كما أشارedg بها، ترقيع نظام الملفات سيكون في اتجاه واحد.

هل يمكن أن تفعل هذا:

head file2 --bytes=1024 >> file1 && tail --bytes=+1024 file2 >file2 

ويمكنك زيادة 1024 وفقا لمساحة القرص إضافية كم لديك، ثم مجرد تكرار هذا حتى يتم نقل كافة بايت.

وهذا هو على الارجح أسرع طريقة للقيام بذلك (من حيث الوقت اللازم لتطوير)

وأنت قد تكون قادرة على الحصول على مساحة عن طريق ضغط نظام الملف بأكمله. أعتقد NTFS يدعم هذا، وأنا متأكد من أن هناك نكهات * أنظمة الملفات لا شىء من شأنها أن تدعم ذلك. كان يمكن أن يكون أيضا صالح بعد نسخ الملفات التي لا تزال لديها المزيد من مساحة القرص خلفها مما كانت عليه عندما كنت بدأت.

وOK، وتغيير مشكلة قليلا. وهناك احتمالات هناك أشياء أخرى على القرص الذي لا تحتاج، ولكن كنت لا تعرف ما هو عليه أو أين هو. إذا كنت يمكن العثور عليه، هل يمكن حذفه، ثم ربما كنت قد مساحة إضافية بما فيه الكفاية.

لتجد هذه "الأورام"، سواء كان عدد قليل من الشركات الكبيرة، أو الكثير من الصغار، وأنا استخدم برنامج أخذ العينات قليلا. بدءا من الجزء العلوي من دليل (أو الجذر) يجعل مرورين. في تمرير 1، ويقطعون شجرة الدليل، حيث تصل أحجام كافة الملفات للحصول على ما مجموعه بايت N. في مرور 2، فإنه يمشي مرة أخرى شجرة الدليل، والتظاهر أنه يقرأ كل ملف. في كل مرة كان يمر N / 20 بايت، فإنه يطبع خارج مسار الدليل واسم الملف هو "القراءة". وبالتالي فإن النتيجة النهائية هي 20 عينة عميقة من أسماء مسار انتشرت بشكل موحد على كافة وحدات البايت تحت الدليل.

وبعد ذلك مجرد إلقاء نظرة على تلك القائمة للأشياء التي تظهر الكثير الذي لا تحتاج، وتذهب ضربة بعيدا.

و(انها ما يعادل مساحة من طريقة أخذ العينات تستخدم لتحسين الأداء.)

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