Модераторы: Partizan, gambit
  

Поиск:

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


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 4.12.2009
Где: Россия, Калуга

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



Здравствуйте!

Есть несколько (много, очень много) мелких файлов на жестком диске в одном каталоге. Необходимо их БЫСТРО скопировать в другой каталог.
Идея такова:
1. Считать файлы в один непрерывный буфер, мегабайт под 60-100
2. Естественно всю информацию о каждом файле сохранить в каком-нибудь List<FileInformation>, это не проблема. Там же записывать смещение и длину каждого файла в нашем буфере
3. Записать весь буфер одним блоком в папку приемник
4. Разделить файл на части прямо на месте, соответствующие этим мелким файлам

Вызывает вопрос пункт 4. Возможен ли он? В ту ли ветку я написал?
Я пишу на c#, но готов послушать и решения на c++, asm, если это вообще возможно.
PM MAIL ICQ   Вверх
Экскалупатор
Дата 24.5.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 24



думаю что не возможно, с той точки зрения что не факт что файлы будут лежать в одном месте подряд, скорее всего они будут разбиты на кластеры и будут в разных местах диска. все файлы все равно придется читать по очереди(т.е. открывать и закрывать поток для каждого файла). на счет скопировать в одно место, по тем же причинам мало вероятно, потому что система может решить не писать их в одно место, а записать их туда куда ей хочется. это что касается описанной ситуации. если же подойти к вопросу творчески то, прочитав все файлы в один буфер и передав по сети весь буфер ты несомненно выиграешь в скорости передачи по сети, потому что не придется создавать подключения для передачи каждого файла, но записывал я бы лучше просто по очереди в фоновом потоке, пока один принимает второй пишет и все довольны.
PM MAIL ICQ   Вверх
Dem0n13
Дата 24.5.2011, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 4.12.2009
Где: Россия, Калуга

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



Экскалупатор
суть не в том, чтобы файлы лежали в соседних кластерах, а в том, чтобы память под все эти файлы выделялась 1 раз (по размеру буфера)
Считывание, понятное дело, по очереди.
PM MAIL ICQ   Вверх
Экскалупатор
Дата 24.5.2011, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 24



ты имеешь ввиду RAM? мне кажется что затраты по выделению памяти будут намного меньше чем затраты на открытие/закрытие файлов. к тому же как ты узнаешь сколько конкретно тебе памяти надо? считать сколько занимают файлы? так уже проще их сразу и прочитать, уверен что будет быстрее... а что делать если не хватит выделенного объема?
Дальше ИМХО:
если же ты имеешь ввиду выделить место на диске для записи буфера то опять же повторюсь, не все так розово как тебе хочется. если к примеру у тебя файл занимает 5КБ, то ты выделишь под него 5КБ, но стандартный размер кластера равен 4КБ, тогда система запишет этот файл в два кластера и таки да выделенного размера не хватит на все файлы.

не знаю точно зачем тебе это нужно, но могу предположить что для ускорения копирования, мне кажется единственный способ выиграть и не запариться придумывать алгоритмы это читать все в один буфер, передавать буфер по сети и на клиенте писать из буфера каждый файл по отдельности. я уверен что даже при выделении места под все файлы писать их придется все равно по отдельности, так что разницы никакой нету.
PM MAIL ICQ   Вверх
-Mikle-
Дата 24.5.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Нельзя. Каждый файл на диске адресуется кластерами. Файл не может начаться в середине кластера. В продолжение примера Экскалупатор, допустим что у тебя два файла по 5КБ, то есть 10КБ всего. Если ты запишешь этот буфер на диск как один файл, то он разместится на трех кластерах (4КБ -- 1КБ+3КБ -- 2КБ). Далее, тебе надо разбить его на два файла. Но как, файл вдеь не может начаться в середине кластера. Отсюда вердикт - непозволительно.

Другое дело, если твой буфер будет строится как образ диска, по тем же правилам и кластеризацией, но я бы не стал лезть в глубины нативной работы с диском только из-за этого (должна быть острая причина, например разработка чего-то типа Acronis TrueImage).


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Dem0n13
  Дата 24.5.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 4.12.2009
Где: Россия, Калуга

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



-Mikle-
Экскалупатор
что-то я недостаточно подумал над вопросом. Мало того, что посреди кластера файл не начнется никак, но и особенности файловой системы я не учел. Ведь маленькие файлы (<2k) вообще могут храниться в записях файловой таблицы.
А я своим разбиением вообще что-то непонятное творю.

Всем спасибо)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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