![]() |
|
Модераторы: bsa |
![]()
|
|
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Программа пишет на диск несколько файлов одновременно, заранее известен размер файлов, есть какое нибудь кросс платформенное решение записать эти файлы на диск с минимальной фрагментацией?
как то увеличить буфер в которым хранятся данные перед записью на диск? если кросс платформенного подхода нет, может кто покажет это решение для винды/линукса? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
для Linux:
>man 2 truncate >man 2 ftruncate |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
то что нужно, не устраивает только то что освобожденное пространство заполняется нолями ( сколько времени займет создание файла например в 1ГБ? я раньше после создания файла записывал ноль в его последний байт (seek, write), но я не знаю как система работает и потому понятия не имею освободится ли все место под файл или только два фрагмента (стартовый и последний в котором я пишу один байт). |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
зачем ты спрашиваешь? проверь! |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
boostcoder, это была риторика ))
просто если я создам дюжину таких файлов (возможно с размером побольше), это разве не убьет мой поток на некоторое время? пишу под виндой, нет никакой возможности проверить под линухом, но код все равно запишу ) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
наверное забавно писать код который не можешь проверить.
|
|||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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' |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
можешь дать реальную ссылку на него, чтоб жрал минимум ресурсов? пробовал несколько раз установить разные версии линуха - результат разочаровывал каждый раз, теряю целый день а в конце система так и не установлена поскольку видите ли ей не хватило еще 1ТБ места на диске ) конечно в конце концов придется установить, программу тестить ведь надо )) |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Сколько я линуксы ни ставил (начиная с Mandrake в начале 2000-х и Gentoo с 2005 года), но никогда они не требовали столько места. Под систему можешь выделить 6-10 ГБ в виртуальной машине (если же хочешь установить на другой раздел основного диска, то выделить рекомендую не менее 20 ГБ). У меня стоит убунта и особых проблем не знаю. |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
да я так прикололся, на самом деле я выделил в виртуалке где то 5ГБ (винт маленький был), устанавливал Debian где то пол дня, в конце оказалось что ему не хватает каких то 500 МБ чтоб установить оконный интерфейс, вот я и забросил это дело, думаю программу допишу чтоб под виндой работала потом уже линукс установлю, но все же это придется сделать ) мне нужна самая легкая версия чтоб можно было проект скомпилировать и потестить, все остальные навороты пока не к чему. попробую arch. Это сообщение отредактировал(а) asmdzen - 29.7.2011, 14:12 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
если у тебя прога без ГУИ, то и ставить его поддержку необходимости нет никакой. *nix - это тебе не Windows/DOS, в которых через консоль хрен что сделаешь.
|
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
GUI на wxwidgets
ненавижу работать с системой, мой принцип: установил - работает. в винде у меня стоит Тотал Командер, VC и CodeBlocks, это все. Не очень хочется выучивать все линуховские команды, хотя знаю что пригодятся. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
для винды SetEndOfFile
-------------------- Обижено школьников: 8 |
|||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 1 Всего: 7 |
asmdzen, https://wiki.archlinux.org/index.php/Offici...x_Install_Guide
Я недавно заводил на virtual-box'е арк + кеды. Делал, кстати, динамический раздел для ОС с минимальным размером 10Гб. Даже близко весь его не забил, но если надо он сам пополнится. Там же всего 1 файл с машиной получается. Главное, чтобы он лежал на винте, где места хватит. Но раз у тебя есть GUI, то я рекомендую не заморачиваться с арком и ставить убунту - времени меньше уйдет, проверено. -------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
bems, спасибо. Вот только он хочет HANDLE, теперь надо будет открывать файлы при помощи CreateFile я так понимаю.
а есть какие то функции для увеличения буфера записи данных на диск? желательно из с++, как именно нужно работать с файлами чтоб можно было изменять размер буфера (iostreams, fopen, open)? например у меня записываются 100 маленьких файлов (~100кБ), нужно увеличить буфер так чтоб они записались разом на диск или хотя бы по завершении записи (close). spyswamp, где ты раньше был? я уже скачал и устанавливаю Arch ) да ладно, не получится попробую Убунту. Это сообщение отредактировал(а) asmdzen - 29.7.2011, 15:02 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
asmdzen, я знаю винапи, но совершенно не знаю плюсов
но вот какая-то open из io.h вроде возвращает хендл -------------------- Обижено школьников: 8 |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
нашел кое что интересное - boost::filesystem::resize_file(const path& p, uintmax_t new_size);
работает как truncate |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
вот только и она и file_size требуют не хэндл а имя файла, получается что если файл уже открыт (ofstream и open) то выдает ошибку типа:
такую же ошибку получаем и в случае атрибута "только чтение" у файла. неужто придется закрыть файл после создания, изменить размер и опять открыть? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
конечно. ведь дескриптор файла уже во владении. а что, нет возможности определить необходимый размер файла до операций с ним? Добавлено через 4 минуты и 19 секунд хотя сообщение в ислючении говорит что операция завершилась успехом оберни этот вызов в try-catch, и посмотри, файл изменяет свой размер? но в любом случае изменять размер файла который уже используется, как-то не правильно. его размер может изменять использующий его код. |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
я его создаю, так что приходится создать, закрыть, изменить размер, опять открыть уже для записи. пробовал создать файл на 10ГБ, не заметил абсолютно никакой нагрузки, хотя файл был заполнен нолями )) есть версия resize_file которая получает в качестве параметра ссылку на boost::system::error_code и возвращает в нем код ошибки, но размер файла не меняется все равно. осталось найти как увеличить выходной буфер записи данных в файл ) |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
ну так определи необходимый размер и потом создавай. откуда мнение что он чем-то должен заполняться?
fstream.rdbuf()->pubsetbuf(ptr, size); |
||||
|
|||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
разве можно создать файл сразу с определенным размером?? да нет, это спецификация resize_file, т.е. он и должен быть заполнен нолями, я писал что никакой нагрузки не заметил когда он заполнялся ) большое спасибо. т.е. я создаю этот буфер (насколько понял можно и перед открытием файла)? при уничтожении fstream'а он освободится? Это сообщение отредактировал(а) asmdzen - 29.7.2011, 20:29 |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
нет. создаешь файл. изменяешь его размер. и пишешь в него!
пруф, пожалуйста.
сам выделяешь, и сам освобождаешь. или используй смарт-поинтер.
|
||||||
|
|||||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
файл и в самом деле был заполнен нолями ) всем спасибо, вопрос считаю закрытым. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
кросплатформенный вариант:
Добавлено @ 21:32 у меня немного иначе написано. ![]() в общем, могу смело утверждать одно: никакое расширенное пространство нулями не заполняется. ибо сейчас я расширил файл до 100Гб, и операция завершилась мгновенно. предполагаю, что при чтении из расширенного пространства ты читаешь нули потому, что ОС реально с диска ничего не читает, ибо знает, что эта область зарезервирована и в нее ничего никогда не писалось. Это сообщение отредактировал(а) boostcoder - 29.7.2011, 21:35 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
так и есть. прочитал расширенных 100Гб, и никакой активности на HDD не возникло
|
|||
|
||||
| asmdzen |
|
||||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
видимо так и есть, я просто предпологал что туда что-то пишется из-за этого
т.е. я думал что это похоже на операцию malloc, а в линуксе еще выполняется ZeroMemory )
не могу понять как это возможно
т.е. файл реально существует, может это файловая система такое вытворяет, типа метод сжатия, но почему размер показывает нормально? Это сообщение отредактировал(а) asmdzen - 29.7.2011, 22:19 |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
написал же выше: Добавлено через 1 минуту и 22 секунды по идее блоки которые добавились, имеют какой-то атрибут, который ядро проверяет при чтении. смысл читать то, куда никто и никогда не писал? |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Это фича файловой системы. Называется sparse file.
на NTFS можно установить у любого файла флаг разрешающий/запрещающий эту фичу. на старых файловых системах (FAT,FAT32) такое не поддерживается. |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
volatile, как-то можно от нее избавится? я просто хочу избежать фрагментации файлов, а получается что просто ничего не делаю.
оказалось мой подход дает тот же результат, т.е. открываю файл (или создаю) делаю seek на нужный размер - 1, пишу ноль, в результате файл нужного размера заполненный нолями. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
asmdzen, там может и не sparse file. По умолчанию эта фича выключена. Наоборот чтобы включить надо сделать кое-какие движения.
Если же к первоначальному вопросу про нефрагментированный файл, то в МСДН есть инфа как создать нефрагментированный файл средствами winapi. Начните отсюда но не знаю. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
мне кажется, вы заблуждаетесь. если для файла зарезервировано некое кол-во блоков, то никакой другой файл их занять не сможет. это и есть способ избежать/уменьшить фрагментацию. asmdzen, эта тема затянулась на три страницы, а я так и не могу понять чего конкретно ты пытаешься добиться, и почему постоянно это "добивание" у тебя новое Это сообщение отредактировал(а) boostcoder - 30.7.2011, 11:33 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Насчет того что там "sparse file" - возможно. Я просто хотел сказал что есть такая фича, и про нее забывать не стоит. Посмотреть/поменять атрибут "sparse file" можно в файловых менеджерах. Например FAR позволяет это сделать для любого файла.
Даже если вы реально заняли какое-то кол-во блоков, не факт что эти блоки расположены не фрагметнировано. Система сама определяет какие блоки выделить для файла, и повлиять на этот выбор стандартными средствами, имхо, нельзя. |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
пишутся несколько тон файлов сразу, кусками по несколько КБ, если я просто создам эти файлы и начну писать то у меня такое подозрение что система их хорошенько перемешает. Насколько я понял в NTFS файл разделен на блоки размером в 64КБ, получается 64КБ от одного файла, следующие от другого, меня это не устраивает, хочется записывать файлы с минимум фрагментов. не понял вопрос, или это не вопрос )
все же, IMO, если зарезервировать для файлов весь размер сразу то фрагментации будет меньше. Добавлено через 6 минут и 27 секунд поведение как у sparse файлов, т.е. весь файл как бы заполнен нолями, но при попытке растянуть файл на 100ГБ при свободных 50 работать не хочет, со sparse файлами вроде должно было прокатить. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
наконец то положительный результат )) вернул размер до байта. в общем я хочу написать класс для буферизированной записи файлов на диск с минимальным обращением к диску и минимальным уровнем фрагментации (и минимальными задержками при записи, для этого делаю отдельный тред). Может мне следовало сперва спросить если нет уже готового решения ) |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
asmdzen, посмотрите как это делается в бусте
Подробнее здесь. Можете взять и переделать как вам будет удобно, без лишнего закрытия/открытия файлов. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
это ясно. я лишь хотел сказать, что зарезервированное пространство для файла, не значит что оно sparse. |
|||
|
||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
не хочется под винду именно писать, к тому же мой вариант не на много хуже:
результат такой же как от boost::resize_file, по крайней мере я разницы не вижу. |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |