用c ++创建大文件的最快方法?

时间:2008-11-05 15:38:08

标签: c++ file-io iostream bulkinsert

创建一个大约50 - 100 MB的c ++平面文本文件 内容'添加第一行'应插入文件400万次

6 个答案:

答案 0 :(得分:16)

使用旧样式文件io

fopen 要写的文件。

fseek 到所需的文件大小 - 1。

fwrite 单个字节

fclose 文件

答案 1 :(得分:11)

创建特定大小文件的最快方法是使用creat()open()创建一个零长度文件,然后使用chsize()更改大小。这将简单地在磁盘上为文件分配块,内容将是这些块中发生的任何内容。它非常快,因为不需要进行缓冲区写入。

答案 2 :(得分:2)

不确定我理解这个问题。是否要确保文件中的每个字符都是可打印的ASCII字符?如果是这样,那怎么样?用“abcdefghabc ....”填充文件

#include <stdio.h>
int main ()
{
   const int FILE_SiZE = 50000; //size in KB
   const int BUFFER_SIZE = 1024;
   char buffer [BUFFER_SIZE + 1];
   int i;
   for(i = 0; i < BUFFER_SIZE; i++)
      buffer[i] = (char)(i%8 + 'a');
   buffer[BUFFER_SIZE] = '\0';

   FILE *pFile = fopen ("somefile.txt", "w");
   for (i = 0; i < FILE_SIZE; i++)
     fprintf(pFile, buffer);

   fclose(pFile);

   return 0;
}

答案 3 :(得分:1)

你没有提到操作系统,但我会假设创建/开/关/写可用。

为了真正有效地编写并假设,例如,4k页面和磁盘块大小以及重复的字符串:

  1. 打开文件。
  2. 在重复的字符串中分配4k *个字符数,理想情况下与页面边界对齐。
  3. 将重复的字符串打印到内存中4k次,精确填充块。
  4. 使用write()根据需要多次将块写入磁盘。您可能希望为最后一个块写一个部分片段,以使尺寸正确。
  5. 关闭文件。
  6. 这绕过了fopen()和朋友的缓冲,这是好的和坏的:他们的缓冲意味着它们很好而且快速,但它们仍然没有那么高效,没有工作的开销用缓冲区。

    这可以很容易地用C ++或C编写,但是假设你为了效率而打算使用POSIX调用而不是iostream或stdio,所以它不在核心库规范之内。

答案 4 :(得分:1)

我遇到了同样的问题,非常快地在Windows上创建了一个约500MB的文件。 传递给fwrite()的较大缓冲区将是最快的速度。

int i;
FILE *fp;

fp = fopen(fname,"wb");

if (fp != NULL) {

    // create big block's data
    uint8_t b[278528]; // some big chunk size

    for( i = 0; i < sizeof(b); i++ ) // custom initialization if != 0x00
    {
        b[i] = 0xFF;
    }

    // write all blocks to file
    for( i = 0; i < TOT_BLOCKS; i++ )
        fwrite(&b, sizeof(b), 1, fp);

    fclose (fp);
}

现在至少在我的Win7 MinGW上几乎可以立即创建文件。 与时间1个字节的fwrite()相比,该操作将在10秒内完成。 通过4k缓冲区将在2秒内完成。

答案 5 :(得分:0)

用c ++创建大文件的最快方法? 好。我认为最快的方式意味着运行时间最短的那个。

使用内容&#39;添加第一行&#39;在c ++中创建一个大约50 - 100 MB的平面文本文件。应该插入文件400万次。

使用旧样式文件io

预分配文件
fopen the file for write.
fseek to the desired file size - 1.
fwrite a single byte
fclose the file

create a string containing the "Added first line\n" a thousand times.
find it's length.

使用旧样式文件io

预分配文件
fopen the file for write.
fseek to the the string length * 4000
fwrite a single byte
fclose the file

open the file for read/write
loop 4000 times, 
    writing the string to the file.
close the file.

这是我最好的猜测。 我确信有很多方法可以做到。