Оптимизация работы с большим объемом данных

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

  1. Xen0

    Xen0 New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    9
    Существует следующая проблема: есть некоторый файл с данными порядка нескольких сотен мегабайт (скажем, 300-500 Мб), задача состоит в том, чтобы произвольво выбирать из него данные. Однако есть несколько требований: программа не должна кушать слишком много памяти и процессорного времени, данные должны извлекаться как можно быстрей, т.е. свести к минимуму работу с жестким диском. Помогите, пожалуйста, придумать/выбрать алгоритм, который реализовал бы работу с учетом вышеперечисленных требований.
     
  2. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    Можно заюзать маппинг (CreateFile,CreateFileMapping, MapViewOfFile, Flush/UnmapViewOfFile,CloseHandle)
    быстро, без явного чтения файла (оно из системного кеша происходит)
    Если это не устроит, можно выделять буфер равный размеру файла через VirtualAlloc и туда считывать весь файл, а оттуда уже обрабатывать.
    В случае с маппингом более 1 Гб размер обрабатывать не получится, в случае с виртуально памятью - без ограничений (в разумных пределах), можно более 1 Гб обрабатывать
     
  3. Xen0

    Xen0 New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    9
    eugene_, тут возникает проблема с потреблением программой оперативной памяти, которое желательно свести к минимуму. По крайней мере, это относится ко второму методу, если я не ошибаюсь.
     
  4. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    Проблемы с оперативной памятью не возникают, т.к. видимо под термином "оперативная" ты имеешь в виду физическую память.
    Виртуальная память - суть своп, то есть файл подкачки, эта память занимает место только на диске и к физической памяти никакого отношения не имеет.
     
  5. Xen0

    Xen0 New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    9
    Под термином "оперативная память" я понимаю как физическую, так и виртуальную память. Файл подкачки наверное еще меньше подходит, чем физическая память, так как
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Устанавливай указатель (SetFilePointer) произвольно и читай (ReadFile) минимально (базы данных для этого и придумали, чтобы ускорить доступ к требуемым данным)
     
  7. Arhara

    Arhara New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2006
    Сообщения:
    10
    Адрес:
    Russia
    Найди меня и расскажи поподробнее :)
     
  8. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    Или создавай минимальный кеш (базы имеют кеш) для уменьшения файловых операций, или упреждающее чтение (не зная тип данных сложно говорить об универсальных методах)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    eugene_
    > "сложно говорить об универсальных методах"
    Правильно, поэтому имеет смысл использовать обычное буферированное чтение, как предлагает bogrus - худо-бедно винда сама если не все, то кое-что разрулит со своим файловым кэшем и упреждающим чтением
     
  10. xVoLAnD

    xVoLAnD New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    1
    Адрес:
    Unknown
    Я, думаю, тут решение бинарные деревья...