2012-06-18 16 views
5

वर्तमान प्रक्रिया को बिना छुए:tar.gz से एक फ़ाइल निकालें, डिस्क

  1. मैं एक tar.gz फ़ाइल है। (असल में, मेरे पास उनमें से 2000 हैं, लेकिन यह एक और कहानी है)।
  2. मैं एक अस्थायी निर्देशिका बनाता हूं, tar.gz फ़ाइल निकालें, 100,000 छोटी फ़ाइलों को प्रकट करता हूं (लगभग 600 बाइट प्रत्येक)।
  3. प्रत्येक फ़ाइल के लिए, मैं इसे एक प्रसंस्करण प्रोग्राम में पाता हूं, पाइप जो किसी अन्य विश्लेषण प्रोग्राम में लूप करता है, और परिणाम को सहेजता है।

मशीनों मैं मुश्किल से एक ही बार में इन प्रक्रियाओं में से एक संभाल कर सकते हैं, कोई बात नहीं 16 (hyperthreaded दोहरी क्वाड-कोर) है कि वे डिफ़ॉल्ट रूप से भेजा उपयोग कर रहा हूँ पर अस्थायी अंतरिक्ष। मैं डिस्क पर सहेजे बिना इस प्रक्रिया को करने का एक तरीका ढूंढ रहा हूं। मेरा मानना ​​है कि tar -xf $file -O <targetname> का उपयोग कर व्यक्तिगत रूप से खींचने वाली फ़ाइलों के लिए प्रदर्शन दंड निषिद्ध होगा, लेकिन यह हो सकता है कि मैं किसके साथ फंस गया हूं।

क्या ऐसा करने का कोई तरीका है?

संपादित करें: के बाद से दो लोगों को पहले से ही इस गलती की है, मैं स्पष्ट करने के लिए जा रहा हूँ:

  • प्रत्येक फ़ाइल समय में एक बिंदु का प्रतिनिधित्व करता है।
  • प्रत्येक फ़ाइल को अलग से संसाधित किया जाता है।
  • एक बार संसाधित हो जाने पर (इस मामले में फूरियर विश्लेषण पर एक संस्करण), प्रत्येक आउटपुट की एक पंक्ति देता है।
  • इस आउटपुट को पूरे समय ऑटोकोरेलेशन जैसी चीजों को करने के लिए जोड़ा जा सकता है।

EDIT2: वास्तविक कोड:

for f in posns/*; do 
    ~/data_analysis/intermediate_scattering_function < "$f" 
done | ~/data_analysis/complex_autocorrelation.awk limit=1000 > inter_autocorr.txt 
+0

असम्पीडित फ़ाइल का कुल आकार क्या है? आपके पास कितना रैम है? –

+0

100 के फाइलें * 4 केबी न्यूनतम फ़ाइल आकार = 400 एमबी। मेरे पास 16 जीबी है, इसलिए 16 बिना किसी मुद्दे के फिट होगा। – zebediah49

+0

ठीक है, मैं आपको रैमडिस्क का उपयोग करने के लिए कहने जा रहा था, लेकिन @ हाराल्ड ब्रिंकहोफ पहले ही कर चुका है :) –

उत्तर

4

ऐसा लगता है कि नौकरी के लिए सही उपकरण शायद शैल स्क्रिप्ट नहीं है। पायथन के पास tarfile मॉड्यूल है जो स्ट्रीमिंग मोड में काम कर सकता है, जिससे आप बड़े संग्रह के माध्यम से केवल एक ही पास कर सकते हैं और अपनी फाइलों को संसाधित कर सकते हैं, जबकि अभी भी अलग-अलग फाइलों को अलग करने में सक्षम हैं (जो tar --to-stdout दृष्टिकोण नहीं होगा)।

+0

पायथन में विश्लेषण कोड दोबारा लिखें; यह घंटों के बजाय कुछ मिनट में भाग गया। – zebediah49

5

आप फ़ाइलों के बीच की सीमाओं की परवाह नहीं करते हैं, तो tar --to-stdout -xf $file तुम क्या चाहते हो जाएगा; यह संग्रह में प्रत्येक फ़ाइल की सामग्री को एक दूसरे के बाद stdout भेजने के लिए भेज देगा।

यह मानता है कि आप जीएनयू टैर का उपयोग कर रहे हैं, जो कि यदि आप बैश का उपयोग कर रहे हैं तो उचित रूप से संभावना है।

[अपडेट]

बाधा है कि आप है कि एक खोल स्क्रिप्ट गलत उपकरण है प्रत्येक फ़ाइल को अलग संसाधित करना चाहते हैं, मैं चार्ल्स डफी के साथ सहमत देखते हुए।

आप अपने अजगर सुझाव की कोशिश कर सकते हैं, या आप Archive::Tar Perl module की कोशिश कर सकते। इनमें से कोई भी आपको मेमोरी में टैर फ़ाइल की सामग्री के माध्यम से फिर से शुरू करने की अनुमति देगा।

+0

दुर्भाग्य से मैं करता हूं; प्रत्येक लक्ष्य फ़ाइल को अलग से संसाधित किया जाना चाहिए .. इसका आउटपुट संयुक्त हो जाता है। – zebediah49

+0

+1 यह '100000' बिल्ली प्रक्रियाओं को बनाने के ऊपरी हिस्से को बचाएगा। जो बहुत अधिक बचाया गया है। – Paulpro

2

आप इस प्रक्रिया को और से लोड करने के लिए एक रैमडिस्क (http://www.vanemery.com/Linux/Ramdisk/ramdisk.html) इस्तेमाल कर सकते हैं।(मुझे साहसपूर्वक लगता है कि आप लिनक्स का उपयोग करते हैं लेकिन अन्य यूनिक्स सिस्टमों में समान प्रकार के प्रावधान होना चाहिए)

+0

मैं tmpfs पर विचार कर रहा था; जिसके लिए मुझे ऐसा करने के लिए एक व्यवस्थापक को मनाने की आवश्यकता है। – zebediah49

4

आप प्रत्येक फ़ाइल के लिए आदेश निष्पादित करने के लिए टैर विकल्प --to-command=cmd का उपयोग कर सकते हैं। टैर फ़ाइल सामग्री को कमांड के मानक इनपुट पर रीडायरेक्ट करता है, और फ़ाइल के बारे में विवरण के साथ कुछ पर्यावरण चर सेट करता है, जैसे TAR_FILENAME। Tar Documentation में अधिक जानकारी।

उदा।

tar zxf file.tar.gz --to-command='./process.sh' 

ध्यान दें कि OSX bsdtar डिफ़ॉल्ट रूप से उपयोग करता है, जो इस विकल्प नहीं है। आप इसके बजाय gnutar को स्पष्ट रूप से कॉल कर सकते हैं।

+0

अच्छा! यह वह है जिसे मैं नहीं जानता था। :) –

0
tar zxvf <file.tar.gz> <path_to_extract> --to-command=cat 

उपरोक्त आदेश केवल शेल पर निकाली गई फ़ाइल की सामग्री दिखाएगा। डिस्क में कोई बदलाव नहीं होगा। टैर कमांड जीएनयू टैर होना चाहिए।

नमूना लॉग:

$ cat file_a 
aaaa 
$ cat file_b 
bbbb 
$ cat file_c 
cccc 
$ tar zcvf file.tar.gz file_a file_b file_c 
file_a 
file_b 
file_c 
$ cd temp 
$ ls <== no files in directory 
$ tar zxvf ../file.tar.gz file_b --to-command=cat 
file_b 
bbbb 
$ tar zxvf ../file.tar.gz file_a --to-command=cat 
file_a 
aaaa 
$ ls <== Even after tar extract - no files in directory. So, no changes to disk 
$ tar --version 
tar (GNU tar) 1.25 
... 
$ 
संबंधित मुद्दे