我有一个包含数百万条记录的大文件 (16 GB)。每条记录都有一个 20 字节的结构。
现在,我需要将此文件拆分为几个临时的新文件(每个文件大约 100 Mb),同时保持此结构完整(不要在中间切割 20 个字节)。
计算新文件大小的最佳算法是什么?
最佳答案
如果每条记录始终为 20 字节,则 100 MB (100 * 1024 * 1024) 文件中正好可以容纳 5242880 条记录。
因此,如何执行此操作应该非常明显,只要您始终一次读取和写入 20 个字节的倍数,就不会有损坏记录的风险。由于您所需的 100 MB 切片大小是其倍数,因此请使用它。如果您在桌面级 PC 或其他设备上执行此操作,100 MB 的 I/O 缓冲区相当大,但还不算极端。
所以,你要做这样的事情:
bool chunkify(const char *filename, size_t chunkSize)
{
void *buffer = malloc(chunkSize);
FILE *in;
bool ok = true;
if (buffer == NULL)
return false;
if ((fin = fopen(filename, "rb")) != NULL)
{
size_t got;
unsigned int count = 0;
while(ok && (got = fread(buffer, 1, chunkSize, fin)) > 0)
{
FILE *fout;
char outname[1024];
snprintf(outname, sizeof outname, "%s-%u", filename, count++);
if ((fout = fopen(outname, "wb")) != NULL)
{
ok &= fwrite(buffer, got, 1, fout);
fclose(fout);
}
}
fclose(fin);
}
free(buffer);
return ok;
}
注意:以上是未经测试的半复杂 I/O 代码,仅作为起点。它可能会有错误等待您发现。
关于c++ - 将一个文件分割成多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378085/