c++怎么快速生成一个包含随机数据的1GB大型测试文件【实战】

张开发
2026/4/19 3:04:35 15 分钟阅读

分享文章

c++怎么快速生成一个包含随机数据的1GB大型测试文件【实战】
用 fwrite 批量写入替代 std::ofstream 可将1GB文件写入从十几分钟压至几秒核心是绕过 iostream 格式化开销以64KB–1MB 二进制块直写磁盘配 binary 模式、预分配 vector 缓冲区、单次初始化 mt19937、精确字节数控制及 Windows 下 _setmode 强制二进制。用 fwrite 配合缓冲区批量写入别用 std::ofstream 直接用 std::ofstream 逐字节或逐行写1GB 文件可能跑十几分钟fwrite 批量写入能压到几秒内。核心是绕过 C iostream 的格式化开销和频繁 syscall让数据以原始二进制块直通磁盘。每次写入至少 64KB65536 字节太小会抵消批量优势1MB 是更稳妥的起点用 std::vectoruint8_t 预分配缓冲区填满后一次性 fwrite避免 new/delete 频繁抖动不要用 std::rand() 填充——它慢且周期短改用 std::mt19937 std::uniform_int_distributionuint8_t但注意只初始化一次引擎别在循环里反复构造文件打开必须用 wb 模式C 风格或 std::ios::binary | std::ios::outC 风格否则 Windows 下换行符会被悄悄替换大小不准生成 1GB 要精确控制字节数别靠循环次数估算1GB 1073741824 字节即 1 30不是 1000*1000*1000。用近似循环次数比如“写 100 万次 1KB”极易偏差几百 MB尤其当缓冲区大小不能整除总长度时。计算完整写入次数full_writes total_size / buffer_size剩余字节数remainder total_size % buffer_size先循环 full_writes 次写满缓冲区再单独处理 remainder 字节用 fwrite(buf, 1, remainder, fp)务必用 fseek(fp, 0, SEEK_END) ftell(fp) 或 stat() 校验最终文件大小CI 环境或某些文件系统如 exFAT可能延迟落盘Windows 下注意 _setmode(_fileno(fp), _O_BINARY)即使开了 wbMSVC CRT 在某些配置下仍可能对 FILE* 默认启用文本模式导致写入 0x0A 时自动转成 0x0D 0x0A文件瞬间变大且内容错乱。调用 fopen 后立刻加 _setmode(_fileno(fp), _O_BINARY)仅 WindowsLinux/macOS 不需要但加了也无害宏定义为空若用 std::ofstream则无需此步——但你本就不该用它见第一条内存够就全塞进 std::vector不够就分块生成1GB 数据全 load 到内存再写对多数现代机器16GB RAM是最快路径但若内存紧张比如嵌入式或容器限制必须流式生成——此时随机性会受限于 PRNG 状态复用。 Felvin AI无代码市场只需一个提示快速构建应用程序

更多文章