none
Как лучше организовать доступ к содержимому больших тектовых файлов RRS feed

  • Вопрос

  • Пишу консольное приложение Visual C++ на MS VS 2013. Имеется два больших текстовых файла А и В. Каждый примерно в 1 мегабайт. Файл А используется как словарь, содержащий слова английского языка с правильным написанием. Файл В содержит фразы из слов на английском языке, слова в которых могут быть написаны с ошибкой. Мне необходимо читать файл В и сверять правильность написания в нем слов по словарю из файла А, согласно некоторому алгоритму проверки. Вопрос такой - имеет ли смысл в случае, если оба файла имеют большой размер сначала прочитать каждый из них в vector<basic_string> (файл А - в вектор vector<basic_string> vecA, а файл В - в vector<basic_string> vecB), а затем уже проверять правильность написания слов, находящихся в vecB по словарю в vecA? Или в случае файлов большого размера можно, в данном случае как-то обойтись без их предварительной загрузки в соответствующие векторы. Как тут лучше организовать доступ к содержимому этих двух файлов?
    23 марта 2015 г. 12:19

Ответы

  • Что именно Вам не понятно в file mapping-е. В справке MSDN все написано. В результате Вы получаете указатель на содержимое файла (на байты). Интерпретируйте его так, как Вам угодно. А читать слова лучше в контейнер set (множество). Там элементы сортируются автоматически и поиск нужного слова будет выполняться быстрее.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Purple_Apple 24 марта 2015 г. 13:45
    24 марта 2015 г. 7:53

Все ответы

  • Мегабайт? Мегабайт это очень маленький файл. Всё в память. Только, вектор, наверное, не лучшая структура для хранения словаря.
    23 марта 2015 г. 12:41
  • 1) А что посоветуете вместо вектора? (это в случае мегабайта)

    2) Ну а если размер каждого файла скажем 100 мегабайт? Ну вообще - предположим больно большой текстовый файл, что б его просто взять и считать в память. Как тут, в моём случае, будет лучше организовать доступ к содержимому этих двух файлов?

    Т.е. моя проблема - это доступ к данным в текстовом файле большого размера. А эталонный словарь и проверяемые фразы могут находится как и в двух отдельных текстовых файлах, так и в одном.

    Помогите, пожалуйста.

    • Изменено Purple_Apple 23 марта 2015 г. 13:14
    23 марта 2015 г. 13:02
  • Структуру данных надо подбирать ориентируясь на "алгоритм проверки". Подозреваю, там есть поиск, а вектор для этого - не самая оптимальная структура (хотя м.б., мой роман с плюсами закончился году так в 2006, так что не знаю, что там внутри вектора).

    Вообще, если помещается в память, надо пихать в память, а вот если не помещается, открывается огромная область идей/решений/итд.

    23 марта 2015 г. 13:44
  • Дайте ссылку на хороший пример применения CreateFileMapping и того, как получить доступ к содержимому объекта отображённого в память файла. Если это отображение текстового файла, то как читать его содержимое?

    • Изменено Purple_Apple 23 марта 2015 г. 16:05
    23 марта 2015 г. 14:00
  • Что именно Вам не понятно в file mapping-е. В справке MSDN все написано. В результате Вы получаете указатель на содержимое файла (на байты). Интерпретируйте его так, как Вам угодно. А читать слова лучше в контейнер set (множество). Там элементы сортируются автоматически и поиск нужного слова будет выполняться быстрее.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Purple_Apple 24 марта 2015 г. 13:45
    24 марта 2015 г. 7:53
  • Если вам действительно нужно держать в памяти большое количество слов, то можно воспользоваться разными хитрыми трюками.

    Например, Код Хаффмана - позволяет добиться расхода памяти всего пара бит на символ. Конечно, при этом придётся использовать специальный алгоритм для сравнения упакованных таким образом слов. Это известная проблема выбора: тратить много памяти или загружать процессор.

    -----

    Кстати, можно не изобретать велосипед, а погуглить что-то типа "spell checker c++ source code".

    • Изменено Petalvik 24 марта 2015 г. 9:44
    24 марта 2015 г. 9:41
  • Извините, Petalvik, но я действую честно. Если мне дали сделать задание, то я его делаю сам, а не ищу готовых исходных текстов. А спросить в форуме - по-моему ничего зазорного и, тем более, нечестного нет. На то и форумы.
    24 марта 2015 г. 13:44