Самый быстрый способ создать большой файл на с ++?

Создайте плоский текстовый файл на C++ размером около 50-100 МБ с содержанием «Добавлена ​​первая строка» нужно вставить в файл 4 миллиона раз

Я думаю, все зависит от того, какой именно «текст» вы хотите добавить в файл и что вы подразумеваете под «лучшим». Самый быстрый? Я полагаю, что многократное написание буфера, содержащего образец текста, поможет вам быстрее всего. Выбор размера буфера для достижения максимальной скорости требует экспериментов.

Mike G. 05.11.2008 18:44

«Лакх» в переводе с индийского означает 10 000 человек.

ijw 05.05.2009 15:49

В исходном вопросе (который был радикально изменен) требовался блок текста, повторяющийся в файле, и хотелось знать, насколько быстро это может быть написано. В измененном вопросе требуется одна строка вверху. И, судя по ответам ниже, у него могли быть и другие итерации.

ijw 16.07.2018 09:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
12 768
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

с использованием файла старого стиля io

fopen файл для записи.

fseek до желаемого размера файла - 1.

fwrite один байт

fclose файл

1) забыл "Добавленную первую строку" 2) не выделяется физически на всех ОС / файловых системах. Некоторые оставляют промежуточные блоки нераспределенными. raj должен сказать, действительно ли дисковое пространство должно быть выделено физически или только логически.

blabla999 13.01.2009 23:23

Что означает 40 лакхов времени?

EvilTeach 14.01.2009 00:25

Ржу не могу. Это решает исходный вопрос. С тех пор его немного отредактировали. Нужен новый ответ.

EvilTeach 13.08.2016 02:03

Если вы когда-нибудь захотите это сделать, используйте man truncate (работает с путем) или ftruncate (с open ()), которые будут расширять, а также усекать файлы до заданной длины.

ijw 16.07.2018 09:59

Самый быстрый способ создать файл определенного размера - просто создать файл нулевой длины с помощью creat() или open(), а затем изменить размер с помощью chsize(). Это просто выделит блоки на диске для файла, содержимое будет таким, каким оно было в этих блоках. Это очень быстро, так как не требуется записи в буфер.

Хорошая операционная система должна обнулить все выделенные блоки в качестве меры безопасности. Я отметил, что Novell Netware сделала это примерно в 1989 году, так что к настоящему времени все должны.

James Curran 05.11.2008 18:58

это зависит от O / S. В большинстве систем Unix, если вы ищете смещение, а затем записываете данные, вы получите «разреженный файл», в котором промежуточные блоки не занимают места на диске.

Alnitak 05.11.2008 19:00

Тот факт, что на самом деле нет выделенных блоков и заполненных нулями, ни здесь, ни там. Разреженные файлы (по крайней мере, в Unix) будут считаться нулевыми, что и является той безопасностью, которую вы ищете.

ijw 05.05.2009 15:48

Не уверен, что понимаю вопрос. Вы хотите убедиться, что каждый символ в файле является печатаемым символом 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 КБ и повторяющаяся строка:

  1. открыть файл.
  2. выделите 4k * количество символов в повторяющейся строке, идеально выровненной по границе страницы.
  3. печатать повторяющуюся строку в памяти 4к раз, точно заполняя блоки.
  4. Используйте write (), чтобы записывать блоки на диск столько раз, сколько необходимо. Вы можете написать частичный кусок для последнего блока, чтобы размер получился правильным.
  5. закройте файл.

Это обходит буферизацию fopen () и друзей, что и хорошо, и плохо: их буферизация означает, что они хорошие и быстрые, но они все равно не будут такими эффективными, как этот, что не имеет накладных расходов на работу с буфером. .

Это можно легко написать на C++ или C, но предполагается, что вы собираетесь использовать вызовы POSIX, а не iostream или stdio для повышения эффективности, поэтому это выходит за рамки спецификации основной библиотеки.

Мне очень нравится этот ответ, однако я тупой новичок в Си, и это кажется тупым вопросом, но как нам согласовать границу страницы ?.

Jack Giffin 11.01.2018 04:38

Страницы размером 4k равномерно распределены, начиная с 0, поэтому указатель, который делится точно на 4k, - это то, что вам нужно. Что-то вроде char * a = malloc (8192); char * align = (char *) (((size_t) a + 4096) & ~ (size_t) 4095) - Вы также можете работать с 4096-a% 4096, если хотите. Вы стремитесь к округленному числу выше a и ниже + 4096, которое делится точно на 4096.

ijw 16.07.2018 09:55

Самый быстрый способ создать большой файл на с ++? В порядке. Я предполагаю, что самый быстрый способ означает тот, который требует наименьшего времени выполнения.

Создайте простой текстовый файл на 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 секунды.

Другие вопросы по теме