Создание большого файла в Windows - PullRequest
15 голосов
/ 18 января 2009

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

Спасибо.

Ответы [ 6 ]

26 голосов
/ 18 января 2009

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

Хитрость в функции SetFilePointerEx. Из MSDN:

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

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

2 голосов
/ 18 января 2009

Извлечение сопоставленных файлов памяти .

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

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

1 голос
/ 04 августа 2014

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

Как говорит MSDN:

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

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

1 голос
/ 23 июня 2010

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

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

Reagds

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

0 голосов
/ 04 августа 2014

Мне известно, что ваш вопрос помечен 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);
}

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

0 голосов
/ 18 января 2009

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

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

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

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

...