ffcnt-0.2.1 is not a library.
ffcnt
Fast file counting and listing for spinning rust, in rust.
ffcnt's purpose is to provide a faster alternatives to some common filesystem operations as a frontend for the platter-walk crate.
ffcnt --type freplacesfind -type f | wc -lffcnt --type f --ls --leaf-order contentreplacesfind -type fand returns files in optimized order for readingffcnt -sreplacesdu -s --apparent-size
Requirements
- Linux
- A filesystem that supports the
fiemapioctl on directories. Currently ext4 is known to provide that. If you know other ones, please report! Incompatible filesystems will work but gain no speedup overfind.
You can test filesystem support with the filefrag tool.
## supported
$ filefrag /tmp/
/tmp/: 3 extents found
## unsupported
$ filefrag /mnt/test/
/mnt/test/: FIBMAP unsupported
Binary
You can find prebuilt x86_64-linux-glibc binaries without debug information under releases. For troubleshooting and other environments you'll have to build your own.
Build
- clone repo
- install liblzo2 and libz (build-time dependencies)
- install rust and cargo
cargo build --release
Usage
ffcnt [FLAGS] [OPTIONS] [dirs]...
FLAGS:
-h, --help Prints help information
--ls list files
-s sum apparent length of matched files. Implies --leaf-order inode.
-V, --version Prints version information
OPTIONS:
--leaf-order <ord> optimize order for listing/stat/reads [values: inode, content, dentry]
--type <type> filter type [values: f, l, d, s, b, c, p]
ARGS:
<dirs>... directories to traverse [default: cwd]
Unscientific Benchmark
Idle system:
# echo 3 > /proc/sys/vm/drop_caches ; time ffcnt .
196608
real 0m23.889s
user 0m1.233s
sys 0m2.127s
# echo 3 > /proc/sys/vm/drop_caches ; time find . -type f | wc -l
196608
real 2m31.562s
user 0m0.557s
sys 0m3.860s
Busy system with mixed read/write workload. Differences in file counts arose due to writes happening in the meantime:
# echo 3 > /proc/sys/vm/drop_caches ; time ffcnt .
4411262
real 10m36.288s
user 0m3.656s
sys 0m7.588s
# echo 3 > /proc/sys/vm/drop_caches ; time find . -type f | wc -l
4412101
real 45m54.955s
user 0m3.212s
sys 0m12.044s
Both tests were performed on HDDs and the files were spread over 65536 directories with a nesting depth of 2, i.e. a branching factor of 256.
Ideas
- 1 thread per block device in tree