Алгоритм быстрого копирования из файла в файл для больших файлов

Тема в разделе "WASM.A&O", создана пользователем Asterix, 23 апр 2010.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    subj
    задача быстро скопировать блок размером 4 гига из одного файла в другой
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Тормоз здесь всё равно дисковая система, так что просто копируй большими ломтями из одного и пиши в другой.
     
  3. assasincore

    assasincore New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2010
    Сообщения:
    55
    Если CopyFile не работает, тогда ReadFile(,, 1024 * N,,, ) WriteFile(,, 1024 * N,,);
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Указатель в файле выравнивать? Какие куски считывать за 1 раз оптимально?
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В смысле выравнивать? Обычно они всегда выровнены по степени 2. Размер в принципе чем больше тем лучше, тут уже надо опытным путём. Хотя у меня запись более нескольких килобайт уже не имело эффекта.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Asterix
    Можно попробовать поиграться с флагами FILE_FLAG_NO_BUFFERING и FILE_FLAG_OVERLAPPED. Должно быть эффективнее, т.к. не будет синхронизации с кешем и его засорения.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Booster
    в смысле того что офсет файла, с которого нужно начать копировать, например 0xCA54B0C1
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Asterix
    Думаю не обязательно, на память оно никак не влияет.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    а на операции чтения с диска?
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    >а на операции чтения с диска?
    Никогда не слышал о таком. По-моему не влияет.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    с диска читается сугубо секторами.
    так что, лучше всё же выравнивание обеспечить на размер сектора, а еще лучше - размер кластера.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    n0name
    А как обеспечить? Это же не файловой, а физическое адрес. К тому же кэширование, плюс работа большими блоками должны устранить эту проблему.
     
  13. Asterix

    Asterix New Member

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

    вобщем сделал с выравниванием на 4096 байт, и чтением блоками по 4096 байт, вроде
    быстренько работает
     
  14. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499