From: Oliver Mattos <oliver.mattos08@imperial.ac.uk>
To: Ray Van Dolson <rayvd@bludgeon.org>
Cc: linux-btrfs <linux-btrfs@vger.kernel.org>,
Tracy Reed <treed@tracyreed.org>,
<btrfs-devel@arbitraryconstant.com>,
Chris Mason <chris.mason@oracle.com>
Subject: Re: Data De-duplication
Date: Thu, 11 Dec 2008 03:42:58 +0000 [thread overview]
Message-ID: <1228966979.7571.48.camel@mattos-laptop> (raw)
In-Reply-To: <1228954691.7571.33.camel@mattos-laptop>
Here is a script to locate duplicate data WITHIN files:
On some test file sets of binary data with no duplicated files, about 3%
of the data blocks were duplicated, and about 0.1% of the data blocks
were nulls. The data was mainly elf and win32 binaries plus some random
game data, office documents and a few images.
This code is hideously slow, so don't give it more than a couple of MB
of files to chew through at once. In retrospect I should've just
written it in plain fast C instead of fighting with bash pipes!
Note to get "verbose" output, just remove everything after the word
"sort" in the code.
___________________ V CODE V ____________________________
#!/bin/bash
# **********************************************************#
# Redunt data detector #
# #
# Simple Script to take an MD5 hash of every block in every #
# file in a folder and detect identical blocks #
# #
# Copyright 2008 Oliver Mattos, Released under the GPL. #
# **********************************************************#
# WARNING - This script is very inefficient, so don't run it
# with more than 50,000 blocks at once.
: ${1?"Usage: $0 PATH [BlockSize]"}
BS=${2-512} #Block Size in bytes, can be specified on command line
NULLCOUNT="0"
DUPCOUNT="0"
TOTCOUNT="0"
NULLHASH=`dd if=/dev/zero bs=$BS count=1 2>/dev/null | md5sum -b`
NULLHASH="${NULLHASH:0:32}"
find "$1" | \
while read i; do
if [ "` stat "$i" -c%f `" == "81a4" ]; then
LEN=` stat "$i" -c%s `
BC=0
while [ $LEN -gt $[$BC * $BS] ]; do
echo `dd if="$i" bs=$BS count=1 skip=$BC 2>/dev/null | md5sum -b`
$BC $i
BC=$[ BC + 1 ]
done
fi;
done | sort | while read j; do
OLDHASH=$HASH
HASH=${j:0:32}
TOTCOUNT=$[ $TOTCOUNT + 1 ]
if [ "$HASH" == "$OLDHASH" ]; then
DUPCOUNT=$[ DUPCOUNT + 1 ]
if [ "$HASH" == "$NULLHASH" ]; then
NULLCOUNT=$[ NULLCOUNT + 1 ]
fi
fi
echo Hashed $TOTCOUNT $BS byte blocks, found $DUPCOUNT redundant \
blocks of data, of which $NULLCOUNT blocks were null.
done | tail -n 1
# these last two lines are a bodge because the variables dont seem to
# come out of the while properly, probably something todo with the
# pipes...
next prev parent reply other threads:[~2008-12-11 3:42 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-09 22:48 Data De-duplication Oliver Mattos
2008-12-10 11:52 ` Miguel Figueiredo Mascarenhas Sousa Filipe
2008-12-10 13:30 ` Chris Mason
2008-12-10 17:53 ` Oliver Mattos
2008-12-11 15:12 ` Chris Mason
[not found] ` <32809.2001:470:e828:1::2:2.1228939660.squirrel@avalon.arbitraryconstant.com>
2008-12-10 21:10 ` Oliver Mattos
2008-12-10 21:19 ` Ray Van Dolson
2008-12-10 21:42 ` Oliver Mattos
2008-12-10 21:57 ` Tracy Reed
2008-12-10 22:06 ` Oliver Mattos
2008-12-10 22:10 ` Ray Van Dolson
2008-12-11 0:18 ` Oliver Mattos
2008-12-11 3:42 ` Oliver Mattos [this message]
2008-12-11 3:50 ` Ray Van Dolson
2008-12-11 9:58 ` Oliver Mattos
2008-12-14 19:37 ` Omen Wild
2008-12-14 12:25 ` Chris Samuel
2008-12-10 13:30 ` seth huang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1228966979.7571.48.camel@mattos-laptop \
--to=oliver.mattos08@imperial.ac.uk \
--cc=btrfs-devel@arbitraryconstant.com \
--cc=chris.mason@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=rayvd@bludgeon.org \
--cc=treed@tracyreed.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox