есть ли альтернатива SetFilePointer?

Тема в разделе "WASM.BEGINNERS", создана пользователем wasmer, 31 июл 2007.

  1. wasmer

    wasmer New Member

    Публикаций:
    0
    тестировал программу чтения/записи файла на файле 531 Мб и процессоре 863 МГц
    подсчитал что только на чтение файла функцией ReadFile уходит 1 мин 22 сек, только на запись файла функцией WriteFile уходит 1 мин 28 сек, если же читать файл ReadFile, затем вызывать SetFilePointer и только потом WriteFile то на это уходит аж 7 мин 12 сек
    отсюда вопрос - чем заменить SetFilePointer?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    wasmer
    Если читаешь и пишешь в разные места, то ничем не заменишь. Вызов SetFilePointer с начала или конца файла приводит к чтению информации о физическом размещении файла на диске, что само по себе занимает много времени. Чтение и запись выполняются с текущей позициии, поэтому в принципе могут занимать меньше времени. Попробуй перемещать указатель с текущей позиции (если это возможно), может быть получишь какой-то выигрыш.
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    wasmer
    Мэппированием отдельных регионов файла


    Пролистай в МСДН функции
    CreateFileA
    CreateFileMapping
    MapViewOfFile

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

    wasm_test wasm test user

    Публикаций:
    0
    Я думаю, что скорее CreateFileMappingA, MapViewOfFile, MapViewOfFileEx +)
     
  5. wasmer

    wasmer New Member

    Публикаций:
    0
    так я и перемещаю с текущей - вот так:
    Код (Text):
    1. invoke SetFilePointer,hFile,negblocksize,NULL,1
     
  6. wasmer

    wasmer New Member

    Публикаций:
    0
    в CreateFileMapping настораживает один момент:
    If an application specifies a size for the file mapping object that is larger than the size of the actual named file on disk, the file on disk is increased to match the specified size of the file mapping object
    то есть ее вызывать опасно для файла
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Какие флаги переданы в CreateFile()?
     
  8. wasmer

    wasmer New Member

    Публикаций:
    0
    вызываю так:
    Код (Text):
    1.     invoke CreateFile,addr [esi].cFileName,
    2. GENERIC_READ Or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL
    попутно заметил ещё такую особенность в Windows 2000 - если копировать 531 мб файл с одного диска на другой на это уходит 3 минуты, если же в другое место на том же диске то аж 10 минут
     
  9. slow

    slow New Member

    Публикаций:
    0
    чем опасно то? бугага
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    crypto
    :)
    Чтение данных никак не может занимать меньше времени, чем определение размещения блоков файла, т.к. в процессе его всё равно они определяются. А последнее также не может занимать много времени, т.к. в случае NTFS это несложные математические подсчёты, а в FAT - чтение небольшого участка диска, правда, непоследовательно, если файл сильно фрагментирован.

    wasmer
    Сам копируешь или через CopyFile?
     
  11. wasmer

    wasmer New Member

    Публикаций:
    0
    если мапить сразу весь файл то можно сразу указать его размер этой функции - проблем нет, но я хочу мапить файл частями допустим по 256 байт, что тогда будет с последней промапленой частью - увеличится ли размер от этого у файла на диске?
     
  12. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    wasmer
    Хм
    Вероятно ты чего-то не понимаешь
    Ты мэпируешь ВЕСЬ! файл.
    Не важно сколько он весит, 5 кб и 2 Тб
    А вот работаешь непосредственно только с частью карты. Усек?

    hMap = CreateFileMappingA(hFile, 0, PAGE_READWRITE, 0,0,0)

    Вот так ты мэпишь файл. Ничто никуда не увеличивается и не уменьшается.
    Создается карта всего файла. Просто с файловой таблицы считываются данные о файле и его размере. А вот непосредственно чтение с диска - это MapViewOfFile.
    Смотришь частями. И пишешь тоже частями.
    Дальше положенного не уедешь ) система не позволит
     
  13. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Great
    Точно. Вторую функцию у себя исправил. это по невнимательности у меня.
    MapViewOfFileEx - я думаю ему и обычной MapViewOfFile хватит
     
  14. wasmer

    wasmer New Member

    Публикаций:
    0
    это понятно, но MapViewOfFile мапит гранулярно, то есть по 256 байт никак не получится, хорошо если гранулы в системе 64 Кбайт, а если несколько Мбайт - программа ведь столько памяти сожрёт
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    IceStudent
    Я имел в виду, что поскольку, видимо, у топикстартера таких операций чтения-записи очень много и результирующие потери времени могут быть уже ощутимыми. Даже если данные о размещении файла на диске постоянно хранятся в памяти, многократное к ним обращение приводит к потерям.
     
  16. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    wasmer
    По поводу памяти.
    К концу операции воода-вывода в файл юзай UnmapViewOfFile. Так ты освобождаешь память. Усек?
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    wasmer
    Эх, все забыли про механику - головки-то надо перемещать, а это - вечность по-сравнению с операциями процессора.
     
  18. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Ещё FILE_FLAG_RANDOM_ACCESS добавить не помешало бы, раз у нас операция не последовательная.