क्या मैं फ़ाइल कैश का उपयोग किए बिना बड़ी फ़ाइलों को तेजी से कॉपी कर सकता हूं?


19

preloadपैकेज को जोड़ने के बाद , मेरे अनुप्रयोगों को गति मिलती है लेकिन अगर मैं एक बड़ी फ़ाइल की प्रतिलिपि बनाता हूं, तो फ़ाइल कैश फ़ाइल के आकार से दोगुने से अधिक बढ़ता है।

एक एकल 3-4 जीबी वर्चुअलबॉक्स छवि या वीडियो फ़ाइल को एक बाहरी ड्राइव पर स्थानांतरित करके, यह विशाल कैश मेमोरी से सभी प्रीलोडेड एप्लिकेशन को हटाने के लिए लगता है, जिससे लोड समय और सामान्य प्रदर्शन ड्रॉप हो जाता है।

क्या बड़ी, बहु-गीगाबाइट फ़ाइलों को कॉपी किए बिना (यानी फ़ाइल कैश को दरकिनार) करने का एक तरीका है ? या कैश्ड होने से विशिष्ट फ़ोल्डर्स को श्वेतसूची या ब्लैकलिस्ट करने का तरीका?

जवाबों:


19

नहीं है nocacheउपयोगिता है, जो की तरह एक आदेश के लिए prepended कर सकते हैं ioniceऔर nice। यह एक लाइब्रेरी को प्रीलोड करने से काम करता है जो ध्वज के posix_fadviseसाथ POSIX_FADV_DONTNEEDकिसी भी खुले कॉल में जोड़ता है ।

सरल शब्दों में, यह कर्नेल को सलाह देता है कि उस विशेष फ़ाइल के लिए कैशिंग की आवश्यकता नहीं है; कर्नेल तो आम तौर पर फ़ाइल को कैश नहीं करेगा । देखें यहाँ तकनीकी जानकारी के लिए।

यह किसी भी विशाल कॉपी नौकरियों के लिए चमत्कार करता है, उदाहरण के लिए, यदि आप सिस्टम को चलाने पर कम से कम संभावित प्रभाव के साथ पृष्ठभूमि में एक बहु टेराबाइट डिस्क का बैकअप लेना चाहते हैं, तो आप कुछ कर सकते हैं nice -n19 ionice -c3 nocache cp -a /vol /vol2

एक पैकेज उबंटू 13.10 और ऊपर में उपलब्ध होगा। यदि आप पिछले रिलीज पर हैं तो आप 13.10 पैकेज स्थापित कर सकते हैं या फ्रेंकोइस मारिएर द्वारा इस 12.04 बैकपोर्ट का विकल्प चुन सकते हैं ।


मैं कुछ के लिए उम्मीद कर रहा था जो जीयूआई के माध्यम से किया जा सकता है, साथ ही साथ 'नो कैश' फ़ोल्डरों को केवल ब्लैकलिस्ट करने का एक तरीका है, लेकिन यह अभी के लिए करना होगा।
विएजर

12

एकल बड़ी फ़ाइलों के लिए, फ़ाइल कैश को बायपास करने के लिए प्रत्यक्ष I / O के ddसाथ उपयोग करें:

यदि आप एक (या कुछ) बड़ी बहु-गीगाबाइट फ़ाइलों को स्थानांतरित करना चाहते हैं, तो यह करना आसान है dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • directझंडे बता ddकर्नेल के प्रत्यक्ष आई / ओ विकल्प (उपयोग करने के लिए O_DIRECTपढ़ना और लिखना, जबकि), इस प्रकार पूरी तरह से फ़ाइल कैश को दरकिनार।
  • bsब्लॉकसाइज विकल्प के लिए एक यथोचित बड़े मान पर सेट किया जाना चाहिए के बाद से भौतिक डिस्क आपरेशन की संख्या को कम करने के लिए dd, प्रदर्शन करना के बाद से पढ़ता / राईट अब कैश नहीं किया जाता और भी कई छोटे प्रत्यक्ष संचालन एक गंभीर मंदी हो सकती है।
    • 1 से 32 एमबी तक के मूल्यों के साथ प्रयोग करने के लिए स्वतंत्र महसूस करें; उपरोक्त सेटिंग 4 एमबी ( 4M) है।

एकाधिक / पुनरावर्ती निर्देशिका प्रतियों के लिए , दुर्भाग्य से, आसानी से उपलब्ध उपकरण नहीं हैं; सामान्य cp, आदि प्रत्यक्ष I / O का समर्थन नहीं करते हैं।

/ e iflags & tolags सही iflag & tolag में बदल गए


1
पुनरावर्ती के साथ किया जा सकता है zshके **ऑपरेटर। zshरिपॉज से मैन्युअल रूप से इंस्टॉल करने की जरूरत है।
मोनिका को बहाल करना - Jul--

1
दरअसल नहीं। ddअजीब अपारदर्शी ** ओपर्टेटर है। आप अभी भी एक खोल स्क्रिप्ट है कि तर्क सामान्य रूप से (मिला इस्तेमाल कर सकते हैं dd.sh in.file out.file** के साथ फ़ाइल नामों में) और करने के लिए फ़ाइल नाम दिया ddका उपयोग कर $1, $2, आदि, जो dd के अजीब वाक्य रचना द्वारा फाउल नहीं किया जाना चाहिए।
मोनिका को बहाल करें - Jul--

1
डायरेक्ट मेक बहुत धीमा है, क्योंकि यह AFAIK रीडहेड कैश को भी निष्क्रिय कर देता है, जो कि शायद आप क्या चाहते हैं, और बेंचमार्किंग परिदृश्य में यथार्थवादी नहीं है। इसके बजाय "iflag = nocache oflag = nocache" का उपयोग करें, जो वास्तव में OS को कहता है कि आपको इन-फाइल या आउट-फाइल कैश की आवश्यकता नहीं है।
स्टॉल्सविक

1

आप एक निर्देशिका ddका उपयोग करके पुनरावर्ती रूप से कॉपी कर सकते हैं findऔरmkdir

हमें दो समस्याओं को हल करने की आवश्यकता है:

  1. dd निर्देशिकाओं के साथ क्या करना है पता नहीं है
  2. dd एक समय में केवल एक फ़ाइल कॉपी कर सकते हैं

पहले इनपुट और आउटपुट निर्देशिकाओं को परिभाषित करते हैं:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

अब cdस्रोत निर्देशिका में चलते हैं, इसलिए findरिश्तेदार निर्देशिकाओं की रिपोर्ट करेंगे जिन्हें हम आसानी से जोड़ सकते हैं:

cd "$SOURCE"

से निर्देशिका वृक्ष डुप्लिकेट $SOURCEकरने के लिए$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

से डुप्लिकेट फ़ाइलें $SOURCEकरने के लिए $TARGETलिखने के कैश को छोड़ते हुए (लेकिन पढ़ने कैश का उपयोग!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

कृपया ध्यान दें कि यह फ़ाइल संशोधन समय, स्वामित्व और अन्य विशेषताओं को संरक्षित नहीं करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.