Here's a quick-and-dirty memory test, written in 'C'. If the disk corruption is due to a memory failure, this might be an easy way to check for that.
Be careful, this will lock up your computer (with virtual memory thrashing) if you attempt to test significantly more memory than is readily available.
time { make -s CFLAGS="-Wall -Werror -std=c99" mymemtest && free -m && ./mymemtest && free -m && echo "PASS" || echo "FAIL" ; }
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <assert.h> int main() { fprintf(stderr,"\n"); fprintf(stderr,"sizeof(int)=%ld, sizeof(void*)=%ld\n", sizeof(int), sizeof(void*) ); double TESTSIZE = 2.2; // amount of memory to test in GB uint64_t K=1024; // used to define a GB typedef uint64_t T; uint64_t sizebytes=TESTSIZE*K*K*K; uint64_t size = sizebytes/sizeof(T); T * a = malloc(sizebytes); assert( a != NULL ); fprintf(stderr,"sizebytes=%ld, size=%ld, chunk size=%ld, test size=%g GB\n", sizebytes, size, sizeof(T), sizebytes/(double)(K*K*K) ); fprintf(stderr,"writing...\n"); for ( uint64_t i=0; i<size; i++ ) a[i] = i; fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)i ); fprintf(stderr,"writing...\n"); for ( uint64_t i=0; i<size; i++ ) a[i] = 0; fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)0 ); fprintf(stderr,"writing...\n"); for ( uint64_t i=0; i<size; i++ ) a[i] = -1; fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)-1 ); fprintf(stderr,"writing...\n"); for ( uint64_t i=0; i<size; i++ ) a[i] = 0x5A5A5A5A5A5A5A5AUL; fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)0x5A5A5A5A5A5A5A5AUL ); fprintf(stderr,"writing...\n"); for ( uint64_t i=0; i<size; i++ ) a[i] = 0xA5A5A5A5A5A5A5A5UL; fprintf(stderr,"checking...\n"); for ( uint64_t i=0; i<size; i++ ) assert( a[i] == (T)0xA5A5A5A5A5A5A5A5UL ); free(a); fprintf(stderr,"\n"); return 0; }