Как элементарно обработать 1 гиг?

Тема в разделе "WASM.A&O", создана пользователем kibernetics, 3 май 2006.

  1. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    Привет всем!

    У меня возник ступор. А точнее следующая ситуация, у меня есть файл размером 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Мб. Что тоже очень долго.

    Я просто хотел узнать, может кто-то сталкивался с обработкой больших файлов? Неужели это и вправду занимает такое большое время? Или алгоритм у меня никудышний? Помогите разобраться... Как можно максимально сократить время для обработки файла такого объема?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    пару минут от силы

    просто взять и скопировать нужное в другой файл,

    тем самым удалив первый кусок и последующие
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    кстати, 1 гиг не такой уж большой файл
     
  4. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    а как скопировать например такое:

    0-511

    528-1039

    1056-1567

    ...

    и так гиг.

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

    и можно ли написать такую функцию на асме например, или на си, а потом ее использовать в ВБ?
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    kibernetics

    По идее если хочешь быстро - уходи с Васика, и все будет оччень шустро. Особенно если достаточно памяти для буферизации чтения/записи.
     
  6. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    уходить с басика? но на что? на дельфи? до асма мне не дотянуть...

    вот интересно бы просто юзать асмовую функцию из под басика.

    где, например, будет функция определения блока (начало, конец, позиция)...

    или такое трудноразрешимое?
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    на VB можно юзать WinAPI так что не думаю что здесь будут тормоза



    kibernetics

    ты плохо объяснил что тебе нужно



    я понял что из файла нужно удалить блоки, соответсвенно

    размер файла уменьшится

    поэтому просто читаем нужное и пишем в новый файл
     
  8. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    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
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    kibernetics

    Это конечно имхо, но все плюсы Васика реализуются в другой области, как правило связанной с GUI, ActiveX, т.е. сверх-HLL. А твоя задача системного уровня, и ее в принципе легко решить, как на Delphi, так и на Си. Делать же микс из Васика и других языков, в данном случае бессмысленно.

    Хотя с другой стороны - хорошо знать язык нужно тот на котором нравится писать код.
     
  10. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Вот кстати переделанный пример с использованием MMF, по идее должен выполнять задачу за считанные минуты (зависит от производительности HDD, и кол-ва оперативной памяти):



    [​IMG] 1379886443__test.zip
     
  11. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    alpet

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

    спасибо большое
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    kibernetics

    Нет, написано на Си, компилировал в MSVS8. А WASM - это (пока еще) это не язык программирования, а сайт, форум и сообщество системных программистов.
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    kibernetics

    Мэппирование не давно мне leo разжевал в одной из моих тем, не советую при 1 Гб.



    Лучше юзая консольную версию проги написанную на VC++ 6.0 за час точно написать можно! Если не знаешь язык, то всего то, что тебе надо:



    #include <windows.h> - рулит!



    Главн.ф-ция: int main(int argc,char * argv[]){твой код return 0; }



    АПИ: CreateFile,ReadFile,WriteFile,CloseHandle



    глянь АПИ в СДК и как вызывать ф-ции на Си в любой книге найти можно, и в течении 3х часов не зная си можно написать!
     
  14. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    А WASM - это (пока еще) это не язык программирования, а сайт, форум и сообщество системных программистов



    Вообще-то, WASM - это еще и Watcom Assembler :)
     
  15. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix



    Можно писать в тотже самый файл, если места на диске мало. Алгоритм от этого не страдает.
     
  16. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.
    уходить с басика? но на что? на дельфи? до асма мне не дотянуть



    Попробуй FREEBASIC!



    Это что-то супер, со встроеным асм'ом.
     
  17. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kibernetics



    Полезно, конечно, знать другие языки/средства программирования, но это не значит, что от бейсика нужно уходить. Нравится бейсик - приграммируйте себе на здоровье на бейсике. Бросать его только потому, что кто-то на форуме сказал, что бейсик тормозной, глупо.
     
  18. kibernetics

    kibernetics New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    28
    Адрес:
    Minsk
    Quantum

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

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

    в целом алгоритм примерно такой:

    1. читаем сначала 4 байта (офсет 0)

    2. ищем такую последовательность дальше по файлу

    3. если найдено, то считываем к этим четырем еще один байт, пятый (офсет 4). опять проверяем совпадение по файлу.

    4. когда максимальное совпадение блоков заканчивается, то чиатем 4 байта уже не сначала, а с офсета +1 байт (офсет 1)

    5. итогом будет результат о количестве одинаковых блоков их размер и место их расположения.
     
  19. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    kibernetics

    Недурственно все-таки уметь строить быстрые алгоритмы. Я вот пока еще так и не научился - даже пример с MMF оказался не быстрым (т.е. теоретически можно быстрее сделать, но сам алгоритм еще усложнится). Что касается выбора языка программирования - если нравиться простота Васика - поищи чтоли нормальный компилятор (некоторое время здесь один пытались разрекламировать), хотя для решения задач системного программирования, я его в любом случае считаю неподходящим. В том же Delphi, можно очень просто реализовать все алгоритмы, в отличии от Си - гораздо быстрее, если незнаешь языка (например - я знаю Си, но вслепую столь простую программу написать несмогу, тогда как на Delphi - запросто).
     
  20. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    kibernetics

    В твоей задаче надо думать не о том, на чем писать, а о том, какой алгоритм выбрать. Если алгоритм хорош, то и на бейсике получится приемлимая скорость, а если алгоритм неважный - никакой с или асм не спасёт от тормозов.

    А конкретно тебе должен помочь алгоритм быстрого поиска последовательности байт. Поищи что-нибудь типа Бойера-Мура и попробуй использовать из vb.

    Если не устроит скорость тогда уже будешь думать, на чем сделать