Привет всем! У меня возник ступор. А точнее следующая ситуация, у меня есть файл размером 1 гиг. Мне нужно: 1. Удалить с начала файла кусок 0 - 42000Н 2. Удалять через каждые 512 байт блок размером 16 байт. Т.е. изначально блок 528 байт, мне нужно, чтобы от него оставалось 512 байт. Так вот, я перепробовал 4 разных алгоритма, но такая медленность работы, что ужас. Неужели это действительно так медленно? 1. Сначала я просто удалил блок (0-42000Н), потом сохранил файл. Это заняло около 1 часа! Это делалось, с помощью АПИ-функции от WinHEX'a в визуалБейсике. 2. Если удалять блок через каждые 512 байт, то за ночь! обработалось только ~11Мб. Чушь какая-то. 3. Короче, я остановился на следующем алгоритме: копирую блок размером 512байт, переключаюсь на другой файл, вставляю, опять перехожу на первый файл, смещаюсь на 516 + 16(те 16, которые мне не нужны) и опять читаю, переключаюсь - вставляю. Так вот за ночь обработалось ~380Мб. Что тоже очень долго. Я просто хотел узнать, может кто-то сталкивался с обработкой больших файлов? Неужели это и вправду занимает такое большое время? Или алгоритм у меня никудышний? Помогите разобраться... Как можно максимально сократить время для обработки файла такого объема?
пару минут от силы просто взять и скопировать нужное в другой файл, тем самым удалив первый кусок и последующие
а как скопировать например такое: 0-511 528-1039 1056-1567 ... и так гиг. куда он будет копировать? сможет ли копировать выборочные блоки? нужно чтоб он за раз скопировал все блоки или после каждого, чтоб вставлял в файл? и можно ли написать такую функцию на асме например, или на си, а потом ее использовать в ВБ?
kibernetics По идее если хочешь быстро - уходи с Васика, и все будет оччень шустро. Особенно если достаточно памяти для буферизации чтения/записи.
уходить с басика? но на что? на дельфи? до асма мне не дотянуть... вот интересно бы просто юзать асмовую функцию из под басика. где, например, будет функция определения блока (начало, конец, позиция)... или такое трудноразрешимое?
на VB можно юзать WinAPI так что не думаю что здесь будут тормоза kibernetics ты плохо объяснил что тебе нужно я понял что из файла нужно удалить блоки, соответсвенно размер файла уменьшится поэтому просто читаем нужное и пишем в новый файл
Asterix да! надо удалять блоки с определенной периодичностью. размер файла естественно уменьшится. у меня сейчас такая схема: For i = 1 To EOF buf = ww.ReadBytes(512) 'читаем блок в 512 байт ww.NextObject 'переключаюсь на второй файл ww.Position = i * 512 - 512 'и перехожу на смещение ww.WriteBytes buf 'вставляю блок ww.NextObject снова переключаюсь на обрабатываемый файл ww.Position = (512 * i) + (i * 16) 'двигаю смещение Next i с помощью такого кода за ночь обработалось ~380Mb
kibernetics Это конечно имхо, но все плюсы Васика реализуются в другой области, как правило связанной с GUI, ActiveX, т.е. сверх-HLL. А твоя задача системного уровня, и ее в принципе легко решить, как на Delphi, так и на Си. Делать же микс из Васика и других языков, в данном случае бессмысленно. Хотя с другой стороны - хорошо знать язык нужно тот на котором нравится писать код.
Вот кстати переделанный пример с использованием MMF, по идее должен выполнять задачу за считанные минуты (зависит от производительности HDD, и кол-ва оперативной памяти): 1379886443__test.zip
alpet да блин, классно. это написано на WASM? вот эта штука маппер очень крутая вещь. с ее помощью можно вытворять серьезные дела. спасибо большое
kibernetics Нет, написано на Си, компилировал в MSVS8. А WASM - это (пока еще) это не язык программирования, а сайт, форум и сообщество системных программистов.
kibernetics Мэппирование не давно мне leo разжевал в одной из моих тем, не советую при 1 Гб. Лучше юзая консольную версию проги написанную на VC++ 6.0 за час точно написать можно! Если не знаешь язык, то всего то, что тебе надо: #include <windows.h> - рулит! Главн.ф-ция: int main(int argc,char * argv[]){твой код return 0; } АПИ: CreateFile,ReadFile,WriteFile,CloseHandle глянь АПИ в СДК и как вызывать ф-ции на Си в любой книге найти можно, и в течении 3х часов не зная си можно написать!
А WASM - это (пока еще) это не язык программирования, а сайт, форум и сообщество системных программистов Вообще-то, WASM - это еще и Watcom Assembler
уходить с басика? но на что? на дельфи? до асма мне не дотянуть Попробуй FREEBASIC! Это что-то супер, со встроеным асм'ом.
kibernetics Полезно, конечно, знать другие языки/средства программирования, но это не значит, что от бейсика нужно уходить. Нравится бейсик - приграммируйте себе на здоровье на бейсике. Бросать его только потому, что кто-то на форуме сказал, что бейсик тормозной, глупо.
Quantum вот и я думаю, что переход повлечет за собой полное изменение представления о программировании. а это конечно же отнимет и без того отсутсвующее время. мне нравится в бейсике простоту реализации кода, но крайне не удовлетворяет скорость выполнения. вот если бы научится использовать апи функции в том же басике, или вот например, можно ли реализовать файл-маппер в бейсике? т.е. мне нужно сделать некий анализатор скопления байт. что это значит, есть файл большого объёма, берутся первые 4 байта и ищется по всему содержимому такой же эталон, если он находится, то к первым взятым четырем байтам сначала приплюсовывается еще байт, т.е. уже ищется пять байтов во файле. и так до тех пор, насколько максимально единтичен искомый блок. потом эта процедура повторяется, но уже с офсетом в один байт. в целом алгоритм примерно такой: 1. читаем сначала 4 байта (офсет 0) 2. ищем такую последовательность дальше по файлу 3. если найдено, то считываем к этим четырем еще один байт, пятый (офсет 4). опять проверяем совпадение по файлу. 4. когда максимальное совпадение блоков заканчивается, то чиатем 4 байта уже не сначала, а с офсета +1 байт (офсет 1) 5. итогом будет результат о количестве одинаковых блоков их размер и место их расположения.
kibernetics Недурственно все-таки уметь строить быстрые алгоритмы. Я вот пока еще так и не научился - даже пример с MMF оказался не быстрым (т.е. теоретически можно быстрее сделать, но сам алгоритм еще усложнится). Что касается выбора языка программирования - если нравиться простота Васика - поищи чтоли нормальный компилятор (некоторое время здесь один пытались разрекламировать), хотя для решения задач системного программирования, я его в любом случае считаю неподходящим. В том же Delphi, можно очень просто реализовать все алгоритмы, в отличии от Си - гораздо быстрее, если незнаешь языка (например - я знаю Си, но вслепую столь простую программу написать несмогу, тогда как на Delphi - запросто).
kibernetics В твоей задаче надо думать не о том, на чем писать, а о том, какой алгоритм выбрать. Если алгоритм хорош, то и на бейсике получится приемлимая скорость, а если алгоритм неважный - никакой с или асм не спасёт от тормозов. А конкретно тебе должен помочь алгоритм быстрого поиска последовательности байт. Поищи что-нибудь типа Бойера-Мура и попробуй использовать из vb. Если не устроит скорость тогда уже будешь думать, на чем сделать