b2cFastCopy

A Windows bulk copier that uses RAM as a shock absorber between fast and slow drives.

Role
Design and engineering
Areas
Tools

Explorer and CopyFileEx aren't slow because the hardware is. They read through the system file cache, run at a queue depth of about one, use the same block size for every device, and don't notice when an SSD's fast cache fills. b2cFastCopy (b2fc) is our answer for copies of tens to hundreds of gigabytes, mixing huge files with trees of small ones.

Flow of a large file through b2fc: scan and profile the drives, probe that the destination can be opened, read unbuffered into page-aligned arena buffers, queue filled chunks tagged with file id and offset, write them at their positions in any order and recycle the buffers, then trim the sector-rounded last chunk and optionally verify with BLAKE3.
Every chunk knows where it belongs, so any worker can write any chunk and order never matters.

How it works

  • One RAM arena, allocated once and carved into page-aligned buffers, so nothing allocates on the hot path. Large pages are used when the privilege is held.
  • Role-agnostic workers. Each worker asks the scheduler which side is starving and does blocking, unbuffered I/O there, so the number of workers on a side is that device's queue depth.
  • An adaptive scheduler that samples every 100 ms and moves between balanced, fill, drain, cache-cliff and same-spindle burst states.
  • Device profiling that picks block size and queue depth per drive class, falling back to timing random reads when a USB bridge won't report whether a disk spins.
  • Optional BLAKE3 verification, a live dashboard, and JSON output.
Five cards for the b2fc scheduler states. Balanced: neither side starved. Fill: fewer filled chunks than writers, so workers shift to reading. Drain: fewer free buffers than readers, so workers shift to writing. Cliff: the short-window rate drops below 70 percent of the long-window rate at full queue depth, so the scheduler stops escalating and fills RAM. Thrash: source and destination share a spindle, so it alternates full-arena read and write bursts.
The scheduler moves role-agnostic workers toward whichever side is starving, and changes state only after two consecutive readings agree.

What it shows

The README is frank about results: most copies are limited by the destination, and then b2fc, robocopy and Explorer all land on the same figure. Where the destination has headroom, it measured 1.13 times faster than robocopy /J /MT:32 for large files and 1.20 times faster for small ones. On a slow disk it reads the whole source into RAM early and releases the source drive a third of the way through the copy.

Bar chart for one USB SSD destination: 859 MB/s for a 12 GiB burst into a fresh cache, 211 MB/s averaged over a 195 GiB real copy, and about 130 MB/s once the drive's cache was exhausted.
A short benchmark into a fresh SSD cache overstates real throughput by more than six times, which is why we detect the cache cliff.
Paired bar chart of measured copy throughput. NVMe to NVMe: robocopy 809 MB/s, b2fc 914 MB/s. NVMe to USB SSD: robocopy 868, b2fc 859. NVMe to USB hard disk: plain robocopy 191, b2fc 185.
When the destination is the limit, every tool lands on about the same number. b2fc pulls ahead only when the destination has headroom.

Our companion tool, DriveSpeedTest, measures the same cache cliffs from the benchmarking side.