Практически, чтобы сохранить тысячи структур данных в файле и выполнить определенный поиск? - PullRequest
1 голос
/ 10 марта 2010

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

Например, проект связан с управлением социальной сетью. Я не буду вдаваться в подробности, потому что это не имеет значения, но идея состоит в том, чтобы использовать лучшие структуры данных для манипулирования этими данными.

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

Я не думаю, что это практично ... Может быть, если бы мы использовали какую-то библиотеку для базы данных, такой как SQLite или что-то в этом роде, но это не так, и я не думаю, что мы должны это делать. Мы должны только кодировать все сами и использовать функции C, такие как these . Я также не думаю, что мы должны делать идеальное управление памятью. Реквизиты проекта не для нас, чтобы кодировать базу данных или даже псевдобазу. От нас этого проекта требуют лучшие структуры данных (если мы знаем, как обосновать, почему мы выбрали их вместо других) для хранения типа данных и всех данных, указанных для проекта.

Я должен сообщить вам, что до этого у нас было 2 класса, где знания, которые мы получили, должны быть применены в этом проекте. Один из них касался основы C, функций, структур, массивов, строк, файлового ввода-вывода, рекурсии, указателей и простых структур данных, таких как двоичные деревья и связанные списки, и тому подобное. В другом рассказывалось о более сложных структурах данных, хеш-таблицах, деревьях AVL, кучах, графиках и т. Д. В нем также говорилось о сложности времени, больших значениях O и подобных вещах.

Например, скажем, все, что у меня в памяти, это идентификаторы пользователей, а затем мне нужно найти всех друзей конкретного пользователя. Мне придется обработать весь файл (или файлы), чтобы найти друзей этого пользователя. Было бы намного проще, если бы я мог хранить все эти данные в памяти.

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

Как это могло быть возможно, используя стандартные функции C, кодируя все вручную и при этом симулируя какую-то базу данных? Это практично вообще?

Я что-то здесь упускаю?

Ответы [ 5 ]

3 голосов
/ 10 марта 2010

Похоже, что проект может быть больше о том, как вы проектируете отношения между вашими «сущностями» данных, а не о том, как вы их храните.Я не думаю, что хранение данных в файлах было бы хорошим решением - ввод-вывод файла будет намного медленнее, чем доступ к вещам в памяти.Если вам необходимо сохранить данные на диске, вы, вероятно, захотите просто использовать базу данных, а не файлы (хотя я знаю, что это академический курс, поэтому кто знает).

Я думаю, вам следуетсосредоточиться больше на том, как вы проектируете свои типы данных и их взаимосвязи, чтобы максимизировать скорость поиска, поиска и т. д. Например, вы можете сохранить всех пользователей в связанном списке или сохранить их в дереве или на графике,но каждый из них будет влиять на то, как быстро вы сможете находить пользователей и т. д. В зависимости от того, какие функции вы хотите использовать на своем сайте социальной сети, будут разные проекты, которые позволят различным типам поведения работать лучше, чем в других.

0 голосов
/ 10 марта 2010

Мне очень трудно понять, что вы пытаетесь спросить здесь.
Но есть общее правило, которое может применяться:

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

Существует множество исключений из этого правила, но для проекта класса, где это будет единственное основное приложение, работающее на компьютере, вы можете также хранить все в памяти. В конце концов, вы уже заплатили за память; Вы не хотите, чтобы он просто сидел без дела.

Возможно, я неправильно понял вопрос, который вы пытаетесь задать ...

0 голосов
/ 10 марта 2010

Это, безусловно, можно сделать. Разветвления ресурсов в файлах Mac System 5-8 хранились как двоичные индексированные базы данных (общее использование термина, не думайте, что SQL!). (Я думаю, что интерфейс на самом деле был написан на ассемблере, но я мог бы сделать это в c).

Единственное: это боль в заднице. Такие файлы обычно должны начинаться с какого-то индекса или заголовка, а затем содержать несколько записей в предсказуемых местах. (Хорошо, иногда первый индекс просто указывает на еще несколько индексов. Сколько уровней косвенного обращения вам нужно?)

Если вы собираетесь это сделать, просто запомните: доступ в двоичном режиме.

0 голосов
/ 10 марта 2010

Хм ... а как же постоянное хранилище ?

Если ваш проект требует, чтобы вы помнили данные о друзьях между двумя перезапусками приложения, то не думаете ли вы, что хранение файлов (или что-то еще становится проблемой)?

0 голосов
/ 10 марта 2010

Из того, что вы говорите, я сомневаюсь, что вам нужно что-то хранить на диске. Одна вещь, которую я хотел бы спросить у учителя, - оптимизируете ли вы время или пространственную сложность (между этими двумя будет компромисс в зависимости от того, чего вы пытаетесь достичь).

...