Создание большого файла в Windows

Мне нужно создать большие относительно большие (1-8 ГБ) файлы. Каков самый быстрый способ сделать это в Windows с помощью C или С++? Мне нужно создать их на лету, и скорость действительно проблема. Файл будет использоваться для эмуляции хранилища. Я получаю случайный доступ в разных смещениях, и мне нужно, чтобы все хранилища были предварительно распределены, но не были инициализированы, в настоящее время мы записываем все хранилища с фиктивными данными, и это занимает слишком много времени.

Спасибо.

Ответы

Ответ 1

Используйте API Win32, CreateFile, SetFilePointerEx, SetEndOfFile и CloseHandle. В том же порядке.

Фокус в функции SetFilePointerEx. Из MSDN:

Обратите внимание, что это не ошибка для установки указатель файла на позицию за пределами конец файла. Размер файл не увеличивается до тех пор, пока вы не вызовете SetEndOfFile, WriteFile или Функция WriteFileEx.

Проводник Windows фактически делает то же самое при копировании файла из одного места в другое. Он делает это, чтобы диск не нуждался в перераспределении файла для фрагментированного диска.

Ответ 2

Отметьте файлы с отображением памяти.

Они очень соответствуют используемому случаю, который вы описываете, высокому и произвольному доступу.

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

Ответ 3

Ну это решение неплохо, но то, что вы ищете, SetFileValidData

Как MSDN sais:

Функция SetFileValidData позволяет избежать заполнения данных с помощью нули при записи в файл не последовательно.

Таким образом, это всегда оставляет данные диска как есть, SetFilePointerEx должен установить все данные в нули, поэтому большое выделение занимает некоторое время.

Ответ 4

Если вы используете NTFS, то разреженные файлы - это путь:

Файл, в котором большая часть данных говорят, что нули содержат разреженные данные задавать. Обычно такие файлы очень большой - например, файл содержащие данные изображения для обработки или матрицы в высокоскоростной база данных. Проблема с файлами содержащих разреженные наборы данных, большинство файлов не содержат полезные данные и, это неэффективное использование дискового пространства.

Сжатие файлов в файле NTFS система является частичным решением проблема. Все данные в файле, который явно не написан явно установить на ноль. Компактные сжатия файлов эти диапазоны нулей. Однако Недостатком сжатия файла является то, что время доступа может увеличиться из-за данных сжатия и декомпрессии.

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

Ответ 5

Используйте команду "fsutil":

E:\VirtualMachines > fsutil file createnew Использование: файл файла fsutil  Например: файл файла fsutil C:\testfile.txt 1000

Reagds

P.S. это для Windows: 2000/XP/7

Ответ 6

Я знаю, что ваш вопрос отмечен Windows, и Брайан Р. Бонди дал вам лучший ответ на ваш вопрос, если вы точно знаете, что вам не придется переносить приложение на другие платформы. Однако, если вам придется переносить приложение на другие платформы, вам может понадобиться сделать что-то более похожее на то, что предложил Адриан Корниш в качестве ответа на вопрос "Как создать файл размером" x "? найденный в Как создать файл с" x " размер?.

FILE *fp=fopen("myfile", "w");
fseek(fp, 1024*1024, SEEK_SET);
fputc('\n', fp);
fclose(fp);

Конечно, есть добавленный поворот. Ответ, предложенный Адрианом Корнишем, использует функцию fseek, которая имеет следующую подпись.

int fseek ( FILE * stream, long int offset, int origin );

Проблема заключается в том, что вы хотите создать очень большой файл с размером файла, который выходит за пределы 32-разрядного целого. Вам нужно использовать 64-битный эквивалент fseek. К сожалению, на разных платформах он имеет разные имена.

Файл заголовка LargeFileSupport.h, найденный в http://mosaik-aligner.googlecode.com/svn-history/r2/trunk/src/CommonSource/Utilities/LargeFileSupport.h, предлагает решение этой проблемы.

Это позволит вам написать следующую функцию.

#include "LargeFileSupport.h"
/* Include other headers. */

bool createLargeFile(const char * filename, off_type size)
{
    FILE *fp = fopen(filename, "w");
    if (!fp)
    {
        return false;
    }
    fseek64(fp, size, SEEK_SET);
    fputc('\n', fp);
    fclose(fp);
}

Я думал, что добавлю это на всякий случай, если информация будет вам полезна.