我有一个包含数百万条记录的大文件(16 Gb)。每条记录都有20字节结构。
现在,我需要将此文件拆分为几个临时的新文件(每个大约100 Mb),同时保持此结构不变(不要在20个字节的中间切割)。
计算新文件大小的最佳算法是什么?
答案 0 :(得分:3)
如果每条记录总是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代码,仅作为起点。它可能会有你发现的错误。
答案 1 :(得分:2)
最好的算法是算术!
20字节记录到100MB的最接近的倍数是5,242,880条记录,实际上正好 100MB。
所以你可以简单地将你的文件切成100MB的块并完成它。