Bir dosyanın “seyrekliğini” nasıl çıktılarım?


15

Ne kadar dosya nominal boyutunun gerçekte verilerle doldurulduğunu nasıl çıktılarım? Gibi vmtouchdosya şu anda bellekte ne kadar gösterir ...

İş akışının şöyle olmasını bekliyorum:

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

Çözüm: Kullanım du -bshve du -shonları karşılaştırın.


1
ile ilgili: seyrek dosyalar ve delik delme ile oynarken verinin nerede olduğunu (ve önceden ayrılmış yazılı olmayan uzantıların nerede olduğunu) göstermek filefragiçin herhangi bir dosya sistemi ve xfs_bmap -vplXFS için temel araçlardır.
Peter Cordes

filefrag data-> çoklu FIBMAP: Invalid argument-> data: 1 extent found...
Vi.

hangi dosya sisteminde? filefrag -een azından XFS ve ext4 üzerinde mükemmel çalışır. Başkaları üzerinde test yapmadım. FIBMAP'e bir geri dönüş ile FIEMAP (kapsam haritası) kullanır. Eğer ioctlbunlar işe yaramazsa, o zaman yararlı olmaz.
Peter Cordes

Tmpfs üzerinde. Benim filefragyok -eseçeneği.
Vi.

Nasıl olduğuna eskidir e2fsprogs? Eminim ki yeni bir özellik değil. Aynı ayrıntılı bilgileri (ayrıca bazı ek başlık satırlarını) yazdıran bir -vseçenek de vardır . Belki de filefragbuna sahip olacaksın. Aksine xfs_bmapolsa da, açıkça ayrı hatları ile delik göstermez, sadece dosya konumunda kesintiler vardır. Her neyse, tmpfsFIEMAP'ı desteklemediğine şaşırmadım, çünkü bir destek mağazası olarak bir blok cihazı yok, bu yüzden uzantıların konumu için mantıklı bir değer yok.
Peter Cordes

Yanıtlar:


19

findvardır %Shatta "seyrekliği" adlı Biçim belirteci

         %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

İlginç. Bir sistemdeki çoğu normal dosya 1.0'ın üzerinde seyreklik gösterir, dizinler, yazılım bağlantıları ve soketler her zaman tam olarak 1.0'a sahip olur.
grochmal

Bazı sistemler veri bloklarını kullanmadan symlink'i doğrudan inode içine kaydetmedi mi? Bunun seyrekliğinin ne olması gerektiğini merak ediyorum. Ayrıca, bu tanım yanlış bir yol değil mi, elbette normal (yani seyrek olmayan) bir dosyada seyreklik sıfır olmalıdır? :)
ilkkachu

@grochmal, ext4 üzerinde (Linux):, ln -s foo link"seyreklik" link: 0. Soketler ve FIFO'ların uzunluğu sıfırdır, bu yüzden findseyrekliği gösterir 1.
ilkkachu

1

Bu findseçeneğe sahip değilseniz , 70'lerden beri UNIX üzerinde çalışan bir yöntem:

ls -ls file

Kullanılan blok sayısını ve yazılan en yüksek baytı yazdıracaktır. Bundan kaç blok tahsis edilmediğini kolayca hesaplayabilirsiniz.


0

İken finds' %Skısa çıkışını yazdırır, daha fazla ayrıntı için size bakmak isteyebilirsiniz sparsetestyazdım hangi - açık kaynak ve github burada . Her deliği yazdırmak (ör.) İstiyorsanız, değiştirmekten çekinmeyin.

Buradasparsetest hata ayıklamak için kullanarak seyrek ayırmalar ile ilgili sorunları gösteren blog makalesi .


Dosyadaki vmtouch -vönbellek alanlarının haritasını yazdırır gibi, bir dosyadaki uzantıların "haritasını" yazdırabilir mi?
Vi.

@Vi. Bir süre önce iyi yazdım ve bazı detayları unuttum - aslında yaptığı şey seyrek bir dosya oluşturmak, veri yazmak, sonra istatistikleri yazdırmak. Sadece istatistiğin yaratılmasını istiyorsun. İhtiyacınız olacak delikleri yazdırmak için lseekbirlikte SEEK_HOLEve SEEK_DATA. Yapması kolay.
abligh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.