Эффективный произвольный доступ в файле?[С] - PullRequest
1 голос
/ 05 мая 2011

У меня есть текстовый файл, который я использую для хранения индекса файлов и слов (с их частотами), которые появляются в них.Мне нужно прочитать файл в память и сохранить слова, чтобы их можно было искать.Файл отформатирован следующим образом:

<files> 169
    0:file0.txt
    1:file1.txt
    2:file2.txt
    3:file3.txt
    ... etc ...
</files>
<list> word 2
    9: 10
    1: 2
</list>
<list> word2 4
    3: 19
    5: 12
    0: 2
    8: 2
</list>
... etc ...

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

Как я могу эффективно выполнить это в C?Я думал, что мне придется что-то делать с fseek и перематывать, как только я доберусь до определенных точек.

Спасибо,
Майк

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Как указал mattnz, этого лучше всего достичь, используя отдельный слой базы данных.Вы можете попробовать SQlite.Настройка практически нулевая и очень стабильная.В противном случае, если вы хотите сделать это в C, у вас может быть заголовок в начале файла со ссылками / индексами на каждый раздел файла.Секция .. , .. .Это только на моей голове.Если вы прочитали какую-либо книгу о реализации баз данных, вы можете найти много других методов.

1 голос
/ 05 мая 2011

Несмотря на то, что C имеет слабую поддержку строк - из того, что я могу сказать, глядя на пример, он имеет четкую структуру, повторный анализ с диска будет практичным.

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

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

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

0 голосов
/ 13 мая 2011

В итоге лучший способ сделать это (для моих нужд) - сохранить указатель на текущее местоположение в файле и использовать rewind( FILE *f );, когда я достиг конца.

...