在 C++ 中创建一个大约 50 - 100 MB 的平面文本文件,内容“添加的第一行”应插入文件中 400 万次
6 回答
使用旧式文件 io
f打开文件进行写入。
fseek到所需的文件大小 - 1。
f写入单个字节
f关闭文件
创建特定大小文件的最快方法是使用creat()
or创建一个长度为零的文件open()
,然后使用chsize()
. 这将只是在磁盘上为文件分配块,内容将是这些块中发生的任何内容。它非常快,因为不需要进行缓冲区写入。
不确定我是否理解这个问题。您想确保文件中的每个字符都是可打印的 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;
}
您没有提到操作系统,但我假设 creat/open/close/write 可用。
对于真正有效的写入和假设,例如 4k 页面和磁盘块大小以及重复字符串:
- 打开文件。
- 在重复的字符串中分配 4k * 字符数,理想情况下与页面边界对齐。
- 将重复的字符串打印到内存中 4k 次,精确地填充块。
- 使用 write() 根据需要多次将块写入磁盘。您可能希望为最后一个块编写部分片段以使大小正确。
- 关闭文件。
这绕过了 fopen() 和朋友的缓冲,这有好有坏:它们的缓冲意味着它们又好又快,但它们仍然不会像这样有效,它没有使用缓冲区的开销.
这可以很容易地用 C++ 或 C 编写,但为了提高效率,假设您将使用 POSIX 调用而不是 iostream 或 stdio,因此它超出了核心库规范。
我遇到了同样的问题,非常快地在 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 几乎可以立即创建文件。与 fwrite() 一次 1 个字节相比,这将在 10 秒内完成。通过 4k 缓冲区将在 2 秒内完成。
在 C++ 中创建大文件的最快方法? 行。我认为最快的方式是指运行时间最短的方式。
在 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.
这是我最好的猜测。我敢肯定有很多方法可以做到这一点。