2012-03-22 3 views
2

Мне нужно выполнить вычисления и манипуляции на чрезвычайно большой таблице или матрице, которая будет иметь примерно 7500 строк и 30000 столбцов.Представление гигантской матрицы/таблицы

Данные матрицы будут выглядеть следующим образом:

Document ID | word1 | слово 2 | слово 3 | ... | слово 30000 | Класс документа
0032 1 0 0 1 P

Другими словами, подавляющее большинство ячеек будет содержать логические значения (0 и 1).

Расчетов, которые необходимо сделать, будет использованияКонтактным слово, вытекающего или выбор функции (уменьшение количества слов с помощью методов сокращения), а также расчеты в класс или за слова и т.д.

Что я имеют в виду проектирование модели ООП для представления матрицы, а затем последующую сериализацию объектов на диск, поэтому я могу повторно использовать их позже. Например, у меня будет объект для каждой строки или каждого столбца или, возможно, объект для каждого пересечения, который содержится в другом классе.

Я думал о представлении его в XML, но размеры файлов могут оказаться проблематичными.

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

Ключевыми проблемами здесь будут производительность (время реакции и т. Д.), А также избыточность и целостность данных, и, очевидно, мне нужно будет сохранить данные на диске.

+0

Пожалуйста, не прикрепите свои заголовки к «C#» и тому подобное. Для этого нужны теги. –

+0

Является ли это матрицей номеров 7500 x 30000, или она представляет собой нечто более сложное? Любой хороший ответ на ваш вопрос зависит от большего количества информации о содержании и структуре этой таблицы или матрицы. –

+0

Столбцы 29998 будут содержать либо 1, либо 0, а остальные два будут содержать строки. – petestar

ответ

3

Вы не объяснили характер вычислений, которые вам нужно делать на столе/матрице, поэтому мне нужно делать предположения, но если я правильно прочитаю ваш вопрос, это может быть плакат, дочерний регистр для использования реляционной базы данных - даже если у вас нет реальных отношений в вашей базе данных. Если вы не можете использовать полный сервер, используйте SQL Server Compact Edition в качестве встроенной базы данных, которая позволит вам программно управлять файлом .SDF, если вы выберете.

Edit:
После второго рассмотрения, я отозвать свое предложение для базы данных. Это происходит из-за количества столбцов в таблице, любая используемая вами реляционная база данных будет иметь жесткие ограничения на это, и я не вижу пути вокруг этого, что не удивительно сложно.

На основе вашего редактирования, я бы сказал, что есть три вещи, которые вы заинтересованы в:

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

Подумав об этом немного, это, как я бы моделировать данные:

  1. С при наличии слов, я чувствую, что лучше всего, чтобы избежать сложной объектной модели. Вы хотите сделать чистый расчет в обоих направлениях (по столбцу и по строке), а наиболее гибкая и потенциально эффективная структура для этого, на мой взгляд, представляет собой простой двумерный массив полей bool, например:

    var wordMatrix = new bool [numDocuments, numWords];

  2. Слова должны быть в массиве или списке string s, которые связаны индексом со вторым столбцом матрицы слова - той, которая определена в примере выше numWords. Если вам нужно было быстро найти конкретное слово, вы можете использовать Dictionary<string, int> с ключом как словом и значением в качестве индекса, чтобы быстро найти индекс определенного слова.

  3. Идентификатор документа аналогичным образом был бы в массиве или в списке int с индексом, связанным с первым столбцом. Я предполагаю, что идентификаторы документа являются целыми числами. Классификация будет подобным массивом или списком, хотя я бы использовал список enum s, представляющий каждое возможное значение классификации. Как и при поиске слов, если вам нужно искать документы по идентификатору, вы можете указать Dictionary<int, int> как ваш поисковый индекс.

Я сделал несколько предположений этой модели, в частности, что вы хотите сделать чистый расчет на наличие слова во всех направлениях, а не «в документе». Если я ошибаюсь, более простой подход может заключаться в том, чтобы опустить двумерный массив и модель по документу, то есть один класс C# Document, с полем DocumentId и DocumentClasification, а также простой массив булевых элементов, которые связаны индексом к списку слов. Затем вы можете работать со списком этих объектов Document вместе с отдельным списком слов.

Как только у вас есть модель данных, которая вам нравится, сохранение ее на диск является самой легкой частью. Просто используйте сериализацию C#. Вы можете сохранить его через XML или двоичный, по вашему выбору. Естественно, что двоичный файл предоставит вам наименьший размер файла (я считаю немного больше 200 МБ плюс размер списка из 30000 слов). Если вы включите индексы поиска словаря, возможно, еще 120 кБ.

+0

Почему, по вашему мнению, база данных была бы хорошей идеей? – jalf

+0

Удастся ли SQL-серверу хранить большую таблицу? – petestar

+0

Строки не представляют проблем, но столбцы будут проблемой, и я, к сожалению, не подумал об этом, когда я сделал эту рекомендацию. – Randolpho

Смежные вопросы