Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись множества файлов без фрагментов, как освободить место под целый файл? 
V
    Опции темы
asmdzen
Дата 28.7.2011, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Программа пишет на диск несколько файлов одновременно, заранее известен размер файлов, есть какое нибудь кросс платформенное решение записать эти файлы на диск с минимальной фрагментацией?
как то увеличить буфер в которым хранятся данные перед записью на диск?
если кросс платформенного подхода нет, может кто покажет это решение для винды/линукса?
PM MAIL   Вверх
boostcoder
Дата 28.7.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



для Linux:
>man 2 truncate
>man 2 ftruncate

PM WWW   Вверх
asmdzen
Дата 28.7.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(boostcoder @  28.7.2011,  20:36 Найти цитируемый пост)
ftruncate

то что нужно, не устраивает только то что освобожденное пространство заполняется нолями (
сколько времени займет создание файла например в 1ГБ?
я раньше после создания файла записывал ноль в его последний байт (seek, write), но я не знаю как система работает и потому понятия не имею освободится ли все место под файл или только два фрагмента (стартовый и последний в котором я пишу один байт).
PM MAIL   Вверх
boostcoder
Дата 28.7.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  28.7.2011,  20:48 Найти цитируемый пост)
сколько времени займет создание файла например в 1ГБ?

зачем ты спрашиваешь? проверь!
PM WWW   Вверх
asmdzen
Дата 28.7.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



boostcoder, это была риторика ))
просто если я создам дюжину таких файлов (возможно с размером побольше), это разве не убьет мой поток на некоторое время?
пишу под виндой, нет никакой возможности проверить под линухом, но код все равно запишу )
PM MAIL   Вверх
boostcoder
Дата 28.7.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



наверное забавно писать код который не можешь проверить.
PM WWW   Вверх
spyswamp
Дата 29.7.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



asmdzen, поставь virtual box (он бесплатный) и arch linux туда какой-нибудь или ubuntu. Очень хорошая и, главное, простая виртуальная машина. Зато тестировать все сможешь. Времени на скачивание/установку/настройку и т.п. займет минут 20-30 + время инсталла ОС.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
asmdzen
Дата 29.7.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(spyswamp @  29.7.2011,  09:51 Найти цитируемый пост)
arch linux туда какой-нибудь

можешь дать реальную ссылку на него, чтоб жрал минимум ресурсов? пробовал несколько раз установить разные версии линуха - результат разочаровывал каждый раз, теряю целый день а в конце система так и не установлена поскольку видите ли ей не хватило еще 1ТБ места на диске )
конечно в конце концов придется установить, программу тестить ведь надо ))
PM MAIL   Вверх
bsa
Дата 29.7.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(asmdzen @  29.7.2011,  10:01 Найти цитируемый пост)
можешь дать реальную ссылку на него, чтоб жрал минимум ресурсов? пробовал несколько раз установить разные версии линуха - результат разочаровывал каждый раз, теряю целый день а в конце система так и не установлена поскольку видите ли ей не хватило еще 1ТБ места на диске )

 smile 
Сколько я линуксы ни ставил (начиная с Mandrake в начале 2000-х и Gentoo с 2005 года), но никогда они не требовали столько места. Под систему можешь выделить 6-10 ГБ в виртуальной машине (если же хочешь установить на другой раздел основного диска, то выделить рекомендую не менее 20 ГБ).
У меня стоит убунта и особых проблем не знаю.
PM   Вверх
asmdzen
Дата 29.7.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(bsa @  29.7.2011,  11:31 Найти цитируемый пост)
никогда они не требовали столько места

да я так прикололся, на самом деле я выделил в виртуалке где то 5ГБ (винт маленький был), устанавливал Debian где то пол дня, в конце оказалось что ему не хватает каких то 500 МБ чтоб установить оконный интерфейс, вот я и забросил это дело, думаю программу допишу чтоб под виндой работала потом уже линукс установлю, но все же это придется сделать )
мне нужна самая легкая версия чтоб можно было проект скомпилировать и потестить, все остальные навороты пока не к чему.
попробую arch.

Это сообщение отредактировал(а) asmdzen - 29.7.2011, 14:12
PM MAIL   Вверх
bsa
Дата 29.7.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



если у тебя прога без ГУИ, то и ставить его поддержку необходимости нет никакой. *nix - это тебе не Windows/DOS, в которых через консоль хрен что сделаешь.
PM   Вверх
asmdzen
Дата 29.7.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(bsa @  29.7.2011,  14:23 Найти цитируемый пост)
если у тебя прога без ГУИ

GUI на wxwidgets

Цитата(bsa @  29.7.2011,  14:23 Найти цитируемый пост)
*nix - это тебе не Windows/DOS, в которых через консоль хрен что сделаешь. 

ненавижу работать с системой, мой принцип: установил - работает. в винде у меня стоит Тотал Командер, VC и CodeBlocks, это все. Не очень хочется выучивать все линуховские команды, хотя знаю что пригодятся.
PM MAIL   Вверх
bems
Дата 29.7.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



для винды SetEndOfFile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
spyswamp
Дата 29.7.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



asmdzen, https://wiki.archlinux.org/index.php/Offici...x_Install_Guide
Я недавно заводил на virtual-box'е арк + кеды. Делал, кстати, динамический раздел для ОС с минимальным размером 10Гб. Даже близко весь его не забил, но если надо он сам пополнится. Там же всего 1 файл с машиной получается. Главное, чтобы он лежал на винте, где места хватит. Но раз у тебя есть GUI, то я рекомендую не заморачиваться с арком и ставить убунту - времени меньше уйдет, проверено. smile Т.к. в арке ставится сначала тупо ядро, потом иксы и т.п. Короче, лучше не париться и ставить debian/ubuntu. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
asmdzen
Дата 29.7.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



bems, спасибо. Вот только он хочет HANDLE, теперь надо будет открывать файлы при помощи CreateFile я так понимаю.
а есть какие то функции для увеличения буфера записи данных на диск? желательно из с++, как именно нужно работать с файлами чтоб можно было изменять размер буфера (iostreams, fopen, open)?
например у меня записываются 100 маленьких файлов (~100кБ), нужно увеличить буфер так чтоб они записались разом на диск или хотя бы по завершении записи (close).

spyswamp, где ты раньше был? я уже скачал и устанавливаю Arch ) да ладно, не получится попробую Убунту.

Это сообщение отредактировал(а) asmdzen - 29.7.2011, 15:02
PM MAIL   Вверх
bems
Дата 29.7.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



asmdzen, я знаю винапи, но совершенно не знаю плюсов smile
но вот какая-то open из io.h вроде возвращает хендл


--------------------
Обижено школьников: 8
PM MAIL   Вверх
asmdzen
Дата 29.7.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



нашел кое что интересное - boost::filesystem::resize_file(const path& p, uintmax_t new_size);
работает как truncate
PM MAIL   Вверх
boostcoder
Дата 29.7.2011, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  29.7.2011,  15:45 Найти цитируемый пост)
boost::filesystem::resize_file(const path& p, uintmax_t new_size);

оО..

буду знать smile

PM WWW   Вверх
asmdzen
Дата 29.7.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(asmdzen @  29.7.2011,  15:45 Найти цитируемый пост)
boost::filesystem::resize_file

вот только и она и file_size требуют не хэндл а имя файла, получается что если файл уже открыт (ofstream и open) то выдает ошибку типа:
Цитата
'boost::filesystem3::filesystem_e
rror'
  what():  boost::filesystem::resize_file: The operation completed successfully:
 "myfile.txt"

такую же ошибку получаем и в случае атрибута "только чтение" у файла.
неужто придется закрыть файл после создания, изменить размер и опять открыть?
PM MAIL   Вверх
boostcoder
Дата 29.7.2011, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  29.7.2011,  18:00 Найти цитируемый пост)
неужто придется закрыть файл после создания, изменить размер и опять открыть?

конечно. ведь дескриптор файла уже во владении.
а что, нет возможности определить необходимый размер файла до операций с ним?

Добавлено через 4 минуты и 19 секунд
хотя сообщение в ислючении говорит что операция завершилась успехом smile 
оберни этот вызов в try-catch, и посмотри, файл изменяет свой размер?
но в любом случае изменять размер файла который уже используется, как-то не правильно. его размер может изменять использующий его код.
PM WWW   Вверх
asmdzen
Дата 29.7.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(boostcoder @  29.7.2011,  18:12 Найти цитируемый пост)
а что, нет возможности определить необходимый размер файла до операций с ним?

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

Цитата(boostcoder @  29.7.2011,  18:12 Найти цитируемый пост)
оберни этот вызов в try-catch

есть версия resize_file которая получает в качестве параметра ссылку на boost::system::error_code
и возвращает в нем код ошибки, но размер файла не меняется все равно.

осталось найти как увеличить выходной буфер записи данных в файл )
PM MAIL   Вверх
boostcoder
Дата 29.7.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  29.7.2011,  20:02 Найти цитируемый пост)
я его создаю, так что приходится создать, закрыть, изменить размер, опять открыть уже для записи.

ну так определи необходимый размер и потом создавай.

Цитата(asmdzen @  29.7.2011,  20:02 Найти цитируемый пост)
хотя файл был заполнен нолями

откуда мнение что он чем-то должен заполняться?

Цитата(asmdzen @  29.7.2011,  20:02 Найти цитируемый пост)
осталось найти как увеличить выходной буфер записи данных в файл )

fstream.rdbuf()->pubsetbuf(ptr, size);
PM WWW   Вверх
asmdzen
Дата 29.7.2011, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(boostcoder @  29.7.2011,  20:11 Найти цитируемый пост)
ну так определи необходимый размер и потом создавай.

разве можно создать файл сразу с определенным размером??  smile 

Цитата(boostcoder @  29.7.2011,  20:11 Найти цитируемый пост)
откуда мнение что он чем-то должен заполняться?

да нет, это спецификация resize_file, т.е. он и должен быть заполнен нолями, я писал что никакой нагрузки не заметил когда он заполнялся )
Цитата(boostcoder @  29.7.2011,  20:11 Найти цитируемый пост)
fstream.rdbuf()->pubsetbuf(ptr, size); 

большое спасибо. т.е. я создаю этот буфер (насколько понял можно и перед открытием файла)? при уничтожении fstream'а он освободится?

Это сообщение отредактировал(а) asmdzen - 29.7.2011, 20:29
PM MAIL   Вверх
boostcoder
Дата 29.7.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  29.7.2011,  20:23 Найти цитируемый пост)
разве можно создать файл сразу с определенным размером??

нет. создаешь файл. изменяешь его размер. и пишешь в него! smile 

Цитата(asmdzen @  29.7.2011,  20:23 Найти цитируемый пост)
 это спецификация resize_file, т.е. он и должен быть заполнен нолями

пруф, пожалуйста.

Цитата(asmdzen @  29.7.2011,  20:23 Найти цитируемый пост)
 я создаю этот буфер (насколько понял можно и перед открытием файла)? при уничтожении fstream'а он освободится?

сам выделяешь, и сам освобождаешь. или используй смарт-поинтер.
Код

std::ofstream of(...);
boost::shared_array<char> buf(new char[size]);
of.rdbuf()->pubsetbuf(buf.get(), size);

PM WWW   Вверх
asmdzen
Дата 29.7.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(boostcoder @  29.7.2011,  20:55 Найти цитируемый пост)
пруф, пожалуйста.

Цитата(http://www.boost.org/doc/libs/1_46_1/libs/filesystem/v3/doc/reference.html#resize_file)
Remarks: Achieves its postconditions as if by POSIX truncate().

Цитата(http://pubs.opengroup.org/onlinepubs/000095399/functions/truncate.html)
If the file was previously shorter than length, its size is increased, and the extended area appears as if it were zero-filled.

файл и в самом деле был заполнен нолями )
всем спасибо, вопрос считаю закрытым.
PM MAIL   Вверх
boostcoder
Дата 29.7.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



кросплатформенный вариант:
Код

#include <cstdint>

int resize_file(const char* path, uint64_t size) {
#ifdef _WIN32
#include <windows.h>

   HANDLE file = CreateFileA(
      path, // FileName
      GENERIC_WRITE, // DesiredAccess
      FILE_SHARE_READ|FILE_SHARE_WRITE, // ShareMode
      0, // SecurityAttributes
      OPEN_EXISTING, // CreationDisposition
      FILE_ATTRIBUTE_NORMAL, // FlagsAndAttributes
      0 // TemplateFile
   );
   if ( file == INVALID_HANDLE_VALUE ) return GetLastError();
   
   LARGE_INTEGER lsize;
   lsize.QuadPart = size;
   
   if ( SetFilePointer(file, lsize.LowPart, &lsize.HighPart, FILE_BEGIN) == INVALID_SET_FILE_POINTER )
      return GetLastError();
   if ( !SetEndOfFile(file) )
      return GetLastError();

#elif __linux__
#include <unistd.h>
#include <sys/types.h>

   if ( truncate(file, size) ) {
      return errno;
   }

#else
#   error "You`r platform is not supported!"
#endif

   return 0;
}



Добавлено @ 21:32
у меня немного иначе написано.
user posted image

в общем, могу смело утверждать одно: никакое расширенное пространство нулями не заполняется. ибо сейчас я расширил файл до 100Гб, и операция завершилась мгновенно.
предполагаю, что при чтении из расширенного пространства ты читаешь нули потому, что ОС реально с диска ничего не читает, ибо знает, что эта область зарезервирована и в нее ничего никогда не писалось.


Это сообщение отредактировал(а) boostcoder - 29.7.2011, 21:35
PM WWW   Вверх
boostcoder
Дата 29.7.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



так и есть. прочитал расширенных 100Гб, и никакой активности на HDD не возникло smile
PM WWW   Вверх
asmdzen
Дата 29.7.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(boostcoder @  29.7.2011,  21:26 Найти цитируемый пост)
предполагаю, что при чтении из расширенного пространства ты читаешь нули потому, что ОС реально с диска ничего не читает, ибо знает, что эта область зарезервирована и в нее ничего никогда не писалось.

видимо так и есть, я просто предпологал что туда что-то пишется из-за этого 
Цитата(http://msdn.microsoft.com/en-us/library/aa365531%28v=vs.85%29.aspx)
If the file is extended, the contents of the file between the old end of the file and the new end of the file are not defined.

т.е. я думал что это похоже на операцию malloc, а в линуксе еще выполняется ZeroMemory )


Цитата(boostcoder @  29.7.2011,  21:44 Найти цитируемый пост)
так и есть. прочитал расширенных 100Гб, и никакой активности на HDD не возникло

не могу понять как это возможно
Цитата
Size: 9,53 MB (10 000 000 bytes)
Size on disk: 9,53 MB (10 002 432 bytes)

т.е. файл реально существует, может это файловая система такое вытворяет, типа метод сжатия, но почему размер показывает нормально?


Это сообщение отредактировал(а) asmdzen - 29.7.2011, 22:19
PM MAIL   Вверх
boostcoder
Дата 29.7.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  29.7.2011,  22:17 Найти цитируемый пост)
не могу понять как это возможно

написал же выше:
Цитата(boostcoder @  29.7.2011,  21:26 Найти цитируемый пост)
при чтении из расширенного пространства ты читаешь нули потому, что ОС реально с диска ничего не читает, ибо знает, что эта область зарезервирована и в нее ничего никогда не писалось.


Добавлено через 1 минуту и 22 секунды
по идее блоки которые добавились, имеют какой-то атрибут, который ядро проверяет при чтении. смысл читать то, куда никто и никогда не писал? smile все логично.
PM WWW   Вверх
volatile
Дата 30.7.2011, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Это фича файловой системы. Называется sparse file.

на NTFS можно установить у любого файла флаг разрешающий/запрещающий эту фичу.
на старых файловых системах (FAT,FAT32) такое не поддерживается.
PM MAIL   Вверх
asmdzen
Дата 30.7.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



volatile, как-то можно от нее избавится? я просто хочу избежать фрагментации файлов, а получается что просто ничего не делаю.

оказалось мой подход дает тот же результат, т.е. открываю файл (или создаю) делаю seek на нужный размер - 1, пишу ноль, в результате файл нужного размера заполненный нолями.
PM MAIL   Вверх
volatile
Дата 30.7.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



asmdzen, там может и не sparse file. По умолчанию эта фича выключена. Наоборот чтобы включить надо сделать кое-какие движения.

Если же к первоначальному вопросу про нефрагментированный файл, то в МСДН есть инфа как создать нефрагментированный файл средствами winapi. Начните отсюда
но 
Цитата(asmdzen @  28.7.2011,  20:00 Найти цитируемый пост)
есть какое нибудь кросс платформенное решение 

не знаю.

PM MAIL   Вверх
boostcoder
Дата 30.7.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(volatile @  30.7.2011,  02:19 Найти цитируемый пост)
Называется sparse file

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

asmdzen, эта тема затянулась на три страницы, а я так и не могу понять чего конкретно ты пытаешься добиться, и почему постоянно это "добивание" у тебя новое smile 

Это сообщение отредактировал(а) boostcoder - 30.7.2011, 11:33
PM WWW   Вверх
volatile
Дата 30.7.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(boostcoder @  30.7.2011,  11:31 Найти цитируемый пост)
мне кажется, вы заблуждаетесь.

Насчет того что там "sparse file" - возможно. Я просто хотел сказал что есть такая фича, и про нее забывать не стоит.
Посмотреть/поменять атрибут "sparse file" можно в файловых менеджерах. Например FAR позволяет это сделать для любого файла.

Цитата(boostcoder @  30.7.2011,  11:31 Найти цитируемый пост)
если для файла зарезервировано некое кол-во блоков, то никакой другой файл их занять не сможет

Даже если вы реально заняли какое-то кол-во блоков, не факт что эти блоки расположены не фрагметнировано.
Система сама определяет какие блоки выделить для файла, и повлиять на этот выбор стандартными средствами, имхо, нельзя.

PM MAIL   Вверх
asmdzen
Дата 30.7.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(boostcoder @  30.7.2011,  11:31 Найти цитируемый пост)
не могу понять чего конкретно ты пытаешься добиться

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

Цитата(boostcoder @  30.7.2011,  11:31 Найти цитируемый пост)
почему постоянно это "добивание" у тебя новое

не понял вопрос, или это не вопрос )

Цитата(volatile @  30.7.2011,  11:56 Найти цитируемый пост)
Система сама определяет какие блоки выделить для файла, и повлиять на этот выбор стандартными средствами, имхо, нельзя.

все же, IMO, если зарезервировать для файлов весь размер сразу то фрагментации будет меньше.

Добавлено через 6 минут и 27 секунд
поведение как у sparse файлов, т.е. весь файл как бы заполнен нолями, но при попытке растянуть файл на 100ГБ при свободных 50 работать не хочет, со sparse файлами вроде должно было прокатить.
PM MAIL   Вверх
volatile
Дата 30.7.2011, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(asmdzen @  30.7.2011,  12:26 Найти цитируемый пост)
со sparse файлами вроде должно было прокатить. 

asmdzen, для проверки, сразу после резервирования места для файла, вызовете функцию GetCompressedFileSize ();
Если размер равен тому что зарезервировали, то значит все нормально. Это не "sparse file" и не сжатый файл.


PM MAIL   Вверх
asmdzen
Дата 30.7.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(volatile @  30.7.2011,  13:01 Найти цитируемый пост)
Это не "sparse file" и не сжатый файл.

наконец то положительный результат ))
вернул размер до байта.

в общем я хочу написать класс для буферизированной записи файлов на диск с минимальным обращением к диску и минимальным уровнем фрагментации (и минимальными задержками при записи, для этого делаю отдельный тред). Может мне следовало сперва спросить если нет уже готового решения )
PM MAIL   Вверх
volatile
Дата 30.7.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



asmdzen, посмотрите как это делается в бусте
Код

BOOL resize_file_api(const wchar_t* p, boost::uintmax_t size)
  {
    HANDLE handle = CreateFileW(p, GENERIC_WRITE, 0, 0, OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL, 0);
    LARGE_INTEGER sz;
    sz.QuadPart = size;
    return handle != INVALID_HANDLE_VALUE
      && ::SetFilePointerEx(handle, sz, 0, FILE_BEGIN)
      && ::SetEndOfFile(handle)
      && ::CloseHandle(handle);
  }

Подробнее здесь.

Можете взять и переделать как вам будет удобно, без лишнего закрытия/открытия файлов.


PM MAIL   Вверх
boostcoder
Дата 30.7.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(volatile @  30.7.2011,  11:56 Найти цитируемый пост)
Даже если вы реально заняли какое-то кол-во блоков, не факт что эти блоки расположены не фрагметнировано.
Система сама определяет какие блоки выделить для файла, и повлиять на этот выбор стандартными средствами, имхо, нельзя.

это ясно. я лишь хотел сказать, что зарезервированное пространство для файла, не значит что оно sparse.

PM WWW   Вверх
asmdzen
Дата 30.7.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(volatile @  30.7.2011,  15:33 Найти цитируемый пост)
Можете взять и переделать как вам будет удобно, без лишнего закрытия/открытия файлов.

не хочется под винду именно писать, к тому же мой вариант не на много хуже:
Код

    int h = open("a.txt", O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0644);
    lseek(h, size-1, SEEK_SET);
    DWORD x = 0;
    write(h, &x, 1);
    close(h); // хотя можно с ним делать уже что угодно

результат такой же как от boost::resize_file, по крайней мере я разницы не вижу.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.