C ++で大きなファイルを作成する最も速い方法は?
-
06-07-2019 - |
質問
C ++で約50〜100 MBのフラットテキストファイルを作成します。 「追加された最初の行」という内容のファイルに400万回挿入する必要があります
解決
古いスタイルのファイルioの使用
書き込み用のファイルを開く。
fseek で目的のファイルサイズに設定します-1。
fwrite 1バイト
ファイルを閉じるファイル
他のヒント
特定のサイズのファイルを作成する最速の方法は、 creat()
または 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;
}
OSについては言及していませんが、creat / open / close / writeが利用可能であると仮定します。
非常に効率的な書き込みと、たとえば4kページとディスクブロックサイズ、繰り返し文字列を想定する場合:
- ファイルを開きます。
- 4k *繰り返し文字列内の文字数を割り当て、理想的にはページ境界に揃えます。
- 繰り返し文字列をメモリに4k回印刷し、ブロックを正確に埋めます。
- write()を使用して、必要な回数だけブロックをディスクに書き出します。サイズが正しくなるように、最後のブロックに部分的なピースを書き込むことをお勧めします。
- ファイルを閉じます。
これは、fopen()およびフレンドのバッファリングをバイパスします。これは良い点と悪い点です。バッファリングは、それらが素晴らしく、高速であることを意味しますが、それでもまだ作業のオーバーヘッドがない、これほど効率的ではありませんバッファで。
これはC ++またはCで簡単に記述できますが、効率化のためにiostreamまたはstdioではなくPOSIX呼び出しを使用することを前提としているため、コアライブラリの仕様外です。
C ++で大きなファイルを作成する最も速い方法? OK。最速の方法とは、実行時間が最短の方法を意味すると思います。
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.
それが私の最善の推測です。 それを行う方法はたくさんあると確信しています。