![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Dem0n13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 4.12.2009 Где: Россия, Калуга Репутация: нет Всего: нет |
Здравствуйте!
Есть несколько (много, очень много) мелких файлов на жестком диске в одном каталоге. Необходимо их БЫСТРО скопировать в другой каталог. Идея такова: 1. Считать файлы в один непрерывный буфер, мегабайт под 60-100 2. Естественно всю информацию о каждом файле сохранить в каком-нибудь List<FileInformation>, это не проблема. Там же записывать смещение и длину каждого файла в нашем буфере 3. Записать весь буфер одним блоком в папку приемник 4. Разделить файл на части прямо на месте, соответствующие этим мелким файлам Вызывает вопрос пункт 4. Возможен ли он? В ту ли ветку я написал? Я пишу на c#, но готов послушать и решения на c++, asm, если это вообще возможно. |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
думаю что не возможно, с той точки зрения что не факт что файлы будут лежать в одном месте подряд, скорее всего они будут разбиты на кластеры и будут в разных местах диска. все файлы все равно придется читать по очереди(т.е. открывать и закрывать поток для каждого файла). на счет скопировать в одно место, по тем же причинам мало вероятно, потому что система может решить не писать их в одно место, а записать их туда куда ей хочется. это что касается описанной ситуации. если же подойти к вопросу творчески то, прочитав все файлы в один буфер и передав по сети весь буфер ты несомненно выиграешь в скорости передачи по сети, потому что не придется создавать подключения для передачи каждого файла, но записывал я бы лучше просто по очереди в фоновом потоке, пока один принимает второй пишет и все довольны.
|
|||
|
||||
Dem0n13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 4.12.2009 Где: Россия, Калуга Репутация: нет Всего: нет |
Экскалупатор,
суть не в том, чтобы файлы лежали в соседних кластерах, а в том, чтобы память под все эти файлы выделялась 1 раз (по размеру буфера) Считывание, понятное дело, по очереди. |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
ты имеешь ввиду RAM? мне кажется что затраты по выделению памяти будут намного меньше чем затраты на открытие/закрытие файлов. к тому же как ты узнаешь сколько конкретно тебе памяти надо? считать сколько занимают файлы? так уже проще их сразу и прочитать, уверен что будет быстрее... а что делать если не хватит выделенного объема?
Дальше ИМХО: если же ты имеешь ввиду выделить место на диске для записи буфера то опять же повторюсь, не все так розово как тебе хочется. если к примеру у тебя файл занимает 5КБ, то ты выделишь под него 5КБ, но стандартный размер кластера равен 4КБ, тогда система запишет этот файл в два кластера и таки да выделенного размера не хватит на все файлы. не знаю точно зачем тебе это нужно, но могу предположить что для ускорения копирования, мне кажется единственный способ выиграть и не запариться придумывать алгоритмы это читать все в один буфер, передавать буфер по сети и на клиенте писать из буфера каждый файл по отдельности. я уверен что даже при выделении места под все файлы писать их придется все равно по отдельности, так что разницы никакой нету. |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Нельзя. Каждый файл на диске адресуется кластерами. Файл не может начаться в середине кластера. В продолжение примера Экскалупатор, допустим что у тебя два файла по 5КБ, то есть 10КБ всего. Если ты запишешь этот буфер на диск как один файл, то он разместится на трех кластерах (4КБ -- 1КБ+3КБ -- 2КБ). Далее, тебе надо разбить его на два файла. Но как, файл вдеь не может начаться в середине кластера. Отсюда вердикт - непозволительно.
Другое дело, если твой буфер будет строится как образ диска, по тем же правилам и кластеризацией, но я бы не стал лезть в глубины нативной работы с диском только из-за этого (должна быть острая причина, например разработка чего-то типа Acronis TrueImage). -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
Dem0n13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 4.12.2009 Где: Россия, Калуга Репутация: нет Всего: нет |
-Mikle-,
Экскалупатор, что-то я недостаточно подумал над вопросом. Мало того, что посреди кластера файл не начнется никак, но и особенности файловой системы я не учел. Ведь маленькие файлы (<2k) вообще могут храниться в записях файловой таблицы. А я своим разбиением вообще что-то непонятное творю. Всем спасибо) |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |