Что использовать для теста производительности (производительности чтения) между FileStream, Embedded SQL и NoSQl? - PullRequest
1 голос
/ 25 февраля 2011

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

Я бы предпочел использовать C # для этой программы, если другой язык не дает мне существенного преимущества.Другое ограничение, которое я ставлю, заключается в том, что все должно быть на одном компьютере.Я не хочу использовать базу данных Oracle или SQL Server, потому что я верю, что другие варианты позволят мне работать намного быстрее.Данные в основном читаются и редко записываются.Когда бы ни происходили изменения или обновления данных, создается новый набор, и это нормально, если запись данных занимает время.

Допущения:
Данные сортируются в числовом порядке.
Структура проста:

Файл Char3: (В этом файле будут храниться только 3 символьных ключа)
Ключ | Значение
100 | 2,5,6,7: 9: 3,4, 5: 3,4,5: 2,5,6,7
999 | 2,5,6,7: 9: 3,4: 3: 2,5

Char5 file: (В этом файле будут храниться только 5 символов)
Ключ | Значение
A1000 | 2,5,6,7: 9: 3,4,5: 3,4,5: 2,5,6,7

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

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

Задаче предоставляется набор из 1-200 (переменной длины). Ключи находят все данные, относящиеся к каждому ключу.

Ягенерирование этих данных из базы данных и, следовательно, может создавать данные в любом формате.

Для теста FileStream я собираюсь заполнить каждую строку для данного файла, а затем использовать FileStream.Seek для быстрого перехода к заданному местоположению на основе заполнения.

Что я хочу сделать, это выяснить, какое из этих приложений будет самым быстрым?

  1. FileStream - со временем я также посмотрю на отображенные в памяти файлы.(Открыть для других параметров)
  2. Встроенный SQL - SQLite (Открыть для других параметров)
  3. NoSql - ??(В поисках предложений)

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

В конечном итоге я также хотел бы выполнять поиск параллельно настолько, насколько я могу.Моим основным требованием является выполнение ПОИСКА.

Любые идеи или предложения будут великолепны.

Спасибо,

ОБНОВЛЕНИЕ: я перечислю детали и результаты опций, как яобработайте их
Найдите 5000 случайных записей (по строке цифр или некоторой другой подобной характеристике) в файле, который содержит 10К строк, 2,28 МБ.

  1. Опции FileStream - Лучшее время: 00: 00: 00.0398530 мс

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Ваша лучшая ставка - Berkeley DB через C # API (который использует хранилище пар ключ-значение) Berkeley DB - это библиотека, поэтому она связана с вашим приложением. Нет отдельного сервера для установки и нет затрат на клиент / сервер. Berkeley DB чрезвычайно быстр, масштабируем и надежен и предназначен для точно того, что вы здесь описываете.

Отказ от ответственности: я менеджер по продукту в Berkeley DB, поэтому я немного предвзят. Но я серьезно, когда говорю, что это именно тот сценарий, для которого разработана Berkeley DB.

0 голосов
/ 25 февраля 2011

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

Не использовать базу данных из-заИзвестно, что чьи-то убеждения не лучший подход к настройке производительности.: -)

...