मैं किसी फ़ाइल का "स्पार्सनेस" कैसे आउटपुट कर सकता हूँ?


15

मैं कैसे आउटपुट करता हूं कि फ़ाइल नाममात्र आकार का कितना डेटा वास्तव में डेटा से भरा है? जैसे vmtouchपता चलता है कि स्मृति में वर्तमान में कितनी फ़ाइल है ...

मुझे वर्कफ़्लो इस तरह होने की उम्मीद है:

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

युक्ति: उपयोग du -bshऔर du -shऔर उनकी तुलना।


1
संबंधित: filefragकिसी भी फाइलसिस्टम के लिए और xfs_bmap -vplएक्सएफएस के लिए डेटा को दिखाने के लिए प्रमुख उपकरण हैं (और जहां पहले से आवंटित अलिखित विस्तार हैं) विरल फाइलों और छेद-छिद्रण के साथ खेल रहे हैं।
पीटर कॉर्ड्स

filefrag data-> बहु FIBMAP: Invalid argument-> data: 1 extent found...
वि।

किस फाइल सिस्टम पर? filefrag -eXFS और ext4 पर पूरी तरह से काम करता है। मैंने दूसरों पर परीक्षण नहीं किया है। यह FIEMAP (हद-नक्शा) का उपयोग करता है, FIBMAP के लिए एक वापसी के साथ। यदि वे ioctlकाम नहीं करते हैं, तो यह उपयोगी नहीं होगा।
पीटर कॉर्ड्स

Tmpfs पर। मेरा विकल्प filefragनहीं है -e
वि।

आपकी उम्र कितनी है e2fsprogs? मुझे पूरा यकीन है कि यह हाल की सुविधा नहीं है। वहाँ भी एक -vविकल्प है जो एक ही क्रिया जानकारी (प्लस कुछ अतिरिक्त हेडर लाइनों) को प्रिंट करता है। शायद आपके filefragपास वह होगा। xfs_bmapहालांकि, इसके विपरीत , यह स्पष्ट रूप से अलग-अलग लाइनों के साथ छिद्रों को इंगित नहीं करता है, यह सिर्फ फ़ाइल स्थिति में असंतोष है। वैसे भी, मुझे आश्चर्य नहीं है कि tmpfsयह FIEMAP का समर्थन नहीं करता है, क्योंकि बैकिंग स्टोर के रूप में कोई ब्लॉक डिवाइस नहीं है, इसलिए एक्स्टेंट के स्थान के लिए कोई समझदार मूल्य नहीं है।
पीटर कॉर्ड्स

जवाबों:


19

findहै %Sफॉर्मेट स्पेसिफायर जो भी "विरल" नाम दिया गया है

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904

दिलचस्प। एक सिस्टम पर अधिकांश नियमित फाइलों में 1.0 से ऊपर स्पार्सिटी होगी, डायरेक्टरी, सॉफ्टलिंक्स और सॉकेट्स हमेशा ठीक 1.0 होंगे।
grochmal

क्या कुछ सिस्टम ने (इनकोड) सिम्पलिंक को सीधे इनोड में सेव नहीं किया, बिना डेटा ब्लॉक का उपयोग किए? आश्चर्य है कि उस की विरलता क्या होनी चाहिए। इसके अलावा, उस गलत तरीके की परिभाषा नहीं है, निश्चित रूप से एक सामान्य (यानी गैर-विरल) फ़ाइल में शून्यता होना चाहिए? :)
ilkkachu

@grochmal, ext4 (लिनक्स) पर: ln -s foo link, की "विरल" link: 0. सॉकेट और FIFOs है लंबाई शून्य है, तो findपता चलता है विरल 1.
ilkkachu

1

यदि आपके findपास वह विकल्प नहीं है, तो एक विधि जो 70 के दशक से UNIX पर काम करती है:

ls -ls file

जो उपयोग किए गए ब्लॉकों की वास्तविक संख्या और अब तक लिखे गए उच्चतम बाइट को प्रिंट करेगा। उससे आप आसानी से गणना कर सकते हैं कि वास्तव में कितने ब्लॉक आवंटित नहीं किए गए हैं।


0

जबकि finds ' %Sएक संक्षिप्त उत्पादन प्रिंट होगा, और अधिक विस्तार के लिए आप रंग-रूप में करने के लिए चाहते हो सकता है sparsetestजो मैंने लिखा - खुला स्रोत, और GitHub पर यहाँ । यदि आप हर छेद को प्रिंट करना चाहते हैं (उदाहरण के लिए) इसे संशोधित करने के लिए स्वतंत्र महसूस करें।

ब्लॉग विरल आवंटन के साथ समस्याओं दिखा लेख यहाँ का उपयोग कर sparsetestइस मुद्दे को डिबग करने के लिए।


क्या यह फ़ाइल में किसी तरह के "मैप" को प्रिंट कर सकता है, जैसे फाइल vmtouch -vमें कैश्ड क्षेत्रों का प्रिंट?
वि।

@Vi। मैंने इसे कुछ समय पहले लिखा था और कुछ विवरणों को भूल गया था - यह वास्तव में क्या कर रहा है एक विरल फ़ाइल बना रहा है, इसके लिए डेटा लिख ​​रहा है, फिर आंकड़े प्रिंट कर रहा है। आप बस स्टैटिस्टिक क्रिएट करना चाहते हैं। छेद प्रिंट करने के लिए आपको और के lseekसाथ की आवश्यकता होगी । करने में आसान। SEEK_HOLESEEK_DATA
abligh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.