Создайте плоский текстовый файл на C++ размером около 50-100 МБ с содержанием «Добавлена первая строка» нужно вставить в файл 4 миллиона раз
«Лакх» в переводе с индийского означает 10 000 человек.
В исходном вопросе (который был радикально изменен) требовался блок текста, повторяющийся в файле, и хотелось знать, насколько быстро это может быть написано. В измененном вопросе требуется одна строка вверху. И, судя по ответам ниже, у него могли быть и другие итерации.





с использованием файла старого стиля io
fopen файл для записи.
fseek до желаемого размера файла - 1.
fwrite один байт
fclose файл
1) забыл "Добавленную первую строку" 2) не выделяется физически на всех ОС / файловых системах. Некоторые оставляют промежуточные блоки нераспределенными. raj должен сказать, действительно ли дисковое пространство должно быть выделено физически или только логически.
Что означает 40 лакхов времени?
Ржу не могу. Это решает исходный вопрос. С тех пор его немного отредактировали. Нужен новый ответ.
Если вы когда-нибудь захотите это сделать, используйте man truncate (работает с путем) или ftruncate (с open ()), которые будут расширять, а также усекать файлы до заданной длины.
Самый быстрый способ создать файл определенного размера - просто создать файл нулевой длины с помощью creat() или open(), а затем изменить размер с помощью chsize(). Это просто выделит блоки на диске для файла, содержимое будет таким, каким оно было в этих блоках. Это очень быстро, так как не требуется записи в буфер.
Хорошая операционная система должна обнулить все выделенные блоки в качестве меры безопасности. Я отметил, что Novell Netware сделала это примерно в 1989 году, так что к настоящему времени все должны.
это зависит от O / S. В большинстве систем Unix, если вы ищете смещение, а затем записываете данные, вы получите «разреженный файл», в котором промежуточные блоки не занимают места на диске.
Тот факт, что на самом деле нет выделенных блоков и заполненных нулями, ни здесь, ни там. Разреженные файлы (по крайней мере, в Unix) будут считаться нулевыми, что и является той безопасностью, которую вы ищете.
Не уверен, что понимаю вопрос. Вы хотите убедиться, что каждый символ в файле является печатаемым символом 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;
}
Вы не упомянули ОС, но я предполагаю, что доступны функции create / open / close / write.
Для действительно эффективной записи и предположения, например, что размер страницы и блока диска 4 КБ и повторяющаяся строка:
Это обходит буферизацию fopen () и друзей, что и хорошо, и плохо: их буферизация означает, что они хорошие и быстрые, но они все равно не будут такими эффективными, как этот, что не имеет накладных расходов на работу с буфером. .
Это можно легко написать на C++ или C, но предполагается, что вы собираетесь использовать вызовы POSIX, а не iostream или stdio для повышения эффективности, поэтому это выходит за рамки спецификации основной библиотеки.
Мне очень нравится этот ответ, однако я тупой новичок в Си, и это кажется тупым вопросом, но как нам согласовать границу страницы ?.
Страницы размером 4k равномерно распределены, начиная с 0, поэтому указатель, который делится точно на 4k, - это то, что вам нужно. Что-то вроде char * a = malloc (8192); char * align = (char *) (((size_t) a + 4096) & ~ (size_t) 4095) - Вы также можете работать с 4096-a% 4096, если хотите. Вы стремитесь к округленному числу выше a и ниже + 4096, которое делится точно на 4096.
Самый быстрый способ создать большой файл на с ++? В порядке. Я предполагаю, что самый быстрый способ означает тот, который требует наименьшего времени выполнения.
Создайте простой текстовый файл на C++ размером около 50–100 МБ с содержимым «Добавлена первая строка», который необходимо вставить в файл 4 миллиона раз.
предварительно выделить файл, используя файл старого стиля 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.
Это мое лучшее предположение. Я уверен, что есть много способов сделать это.
Я столкнулся с той же проблемой, очень быстро создав файл размером ~ 500 МБ в Windows. Чем больше буфер вы передаете в 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 секунды.
Я думаю, все зависит от того, какой именно «текст» вы хотите добавить в файл и что вы подразумеваете под «лучшим». Самый быстрый? Я полагаю, что многократное написание буфера, содержащего образец текста, поможет вам быстрее всего. Выбор размера буфера для достижения максимальной скорости требует экспериментов.