{
  "slug": "file-transfer-duration",
  "title": "File/Media Transfer Duration Estimator",
  "heading": "File Transfer Duration Estimator",
  "category": "math",
  "url": "https://www.revenuelab.fyi/toolbox/file-transfer-duration",
  "summary": "Estimate upload or download time for a batch of files over your connection.",
  "description": "This is the batch-oriented companion to a single-transfer calculator: instead of one file over one theoretical link, it estimates real time for uploading or downloading many files, accounting for per-file overhead that a single large-file calculation ignores. Every file transfer has fixed overhead — connection setup, authentication handshake, directory listing, TLS negotiation — that adds up fast when moving thousands of small files, which is why syncing 10,000 small files often takes far longer than one large file of the same total size. This calculator adds a fixed per-file overhead time to the raw bandwidth-limited transfer time, multiplied by file count, so you get a realistic total instead of a bandwidth-only number that undercounts small-file transfers by an order of magnitude in the worst cases.",
  "formula": "Total time = (total data size ÷ effective bandwidth) + (file count × per-file overhead seconds).",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=file-transfer-duration",
  "inputs": [
    {
      "id": "fileCount",
      "label": "Number of files",
      "kind": "number",
      "hint": null,
      "default": 5000,
      "unit": null,
      "min": 1,
      "max": null
    },
    {
      "id": "avgFileSizeMb",
      "label": "Average file size",
      "kind": "number",
      "hint": null,
      "default": 4,
      "unit": "MB",
      "min": 0.001,
      "max": null
    },
    {
      "id": "bandwidthMbps",
      "label": "Available bandwidth",
      "kind": "number",
      "hint": null,
      "default": 100,
      "unit": "Mbps",
      "min": 0.1,
      "max": null
    },
    {
      "id": "overheadMs",
      "label": "Overhead per file",
      "kind": "number",
      "hint": null,
      "default": 150,
      "unit": "ms",
      "min": 0,
      "max": null
    },
    {
      "id": "parallelism",
      "label": "Concurrent transfers",
      "kind": "number",
      "hint": null,
      "default": 8,
      "unit": null,
      "min": 1,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "totalMinutes",
      "label": "Estimated total time (minutes)",
      "format": "decimal",
      "hint": null,
      "primary": true
    },
    {
      "id": "totalSeconds",
      "label": "In seconds",
      "format": "decimal",
      "hint": null,
      "primary": false
    },
    {
      "id": "totalDataGb",
      "label": "Total data volume (GB)",
      "format": "decimal",
      "hint": null,
      "primary": false
    },
    {
      "id": "overheadShare",
      "label": "% of time spent on per-file overhead",
      "format": "percent",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Number of files: 5000",
      "Average file size: 4 MB",
      "Available bandwidth: 100 Mbps",
      "Overhead per file: 150 ms",
      "Concurrent transfers: 8"
    ],
    "outputs": [
      "Estimated total time (minutes): 4.9",
      "In seconds: 293.8",
      "Total data volume (GB): 20",
      "% of time spent on per-file overhead: 31.9%"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter number of files.",
      "Enter average file size (MB).",
      "Enter available bandwidth (Mbps).",
      "Enter overhead per file (ms).",
      "Enter concurrent transfers.",
      "Read your estimated total time (minutes) on the right — it updates as you type.",
      "Hit Share to keep the scenario or send it to someone."
    ]
  },
  "scenarios": [
    {
      "name": "Conservative",
      "description": "Lower-end numbers — what if things land soft?",
      "values": {
        "fileCount": 3000,
        "avgFileSizeMb": 2.4,
        "bandwidthMbps": 60,
        "overheadMs": 90,
        "parallelism": 5
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "fileCount": 5000,
        "avgFileSizeMb": 4,
        "bandwidthMbps": 100,
        "overheadMs": 150,
        "parallelism": 8
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "fileCount": 8000,
        "avgFileSizeMb": 6.4,
        "bandwidthMbps": 160,
        "overheadMs": 240,
        "parallelism": 13
      }
    }
  ],
  "limitations": [
    "Results are rounded for display; the underlying calculation keeps full precision.",
    "Very large or very small inputs may hit floating-point limits in the browser.",
    "Inputs outside the accepted range are clamped rather than rejected."
  ],
  "faq": [
    {
      "q": "Why does parallelism help so much with many small files?",
      "a": "Per-file overhead (connection setup, auth, TLS handshake) is largely wait time, not bandwidth-limited, so running transfers concurrently overlaps that dead time across files instead of paying it serially. Going from 1 to 8 concurrent transfers on a small-file-heavy sync commonly cuts total time 5-7x, though gains taper off once you saturate the link's total bandwidth or the server's connection limits."
    },
    {
      "q": "When does overhead dominate over raw bandwidth?",
      "a": "Once average file size drops below roughly (bandwidth × overhead time) — for a 100 Mbps link with 150ms overhead, that threshold is around 1.9 MB per file. Below that size, most of your transfer time is overhead, not data movement, and the fix is batching files (tar/zip before transfer) rather than chasing more bandwidth."
    },
    {
      "q": "Should I archive small files before a cloud migration?",
      "a": "Yes, for migrations involving hundreds of thousands of small files — bundling them into fewer, larger archive files before transfer, then unpacking at the destination, routinely cuts total migration time by 60-90% versus transferring files individually, because it collapses per-file overhead into a handful of large transfers instead of paying it per file."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/data-transfer-time-calculator",
    "https://www.revenuelab.fyi/toolbox/bandwidth-for-n-users",
    "https://www.revenuelab.fyi/toolbox/cloud-egress-cost"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — File/Media Transfer Duration Estimator (https://www.revenuelab.fyi/toolbox/file-transfer-duration)"
}