将文件拆分为多个文件

时间:2014-10-15 08:39:20

标签: c++ c

我有一个包含数百万条记录的大文件(16 Gb)。每条记录都有20字节结构。

现在,我需要将此文件拆分为几个临时的新文件(每个大约100 Mb),同时保持此结构不变(不要在20个字节的中间切割)。

计算新文件大小的最佳算法是什么?

2 个答案:

答案 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的块并完成它。