> 60K вставок в секунду хранилища значений ключей для использования с Java - PullRequest
0 голосов
/ 26 марта 2012

Я работаю над пользовательским решением, где мне нужно хранить огромные данные в файл / db со скоростью 60K записей в секунду.Эти данные являются результатом входящего непрерывного потока.

  1. leveldb - к ним нельзя получить доступ одновременно из нескольких процессов Java

  2. berkleydb / kyoto cabinet:запрещенная коммерческая лицензия

  3. sqlite: пробовал sqlite4java, но он не поддерживает массовые операции и не выполняет с требуемой скоростью.Также пробовал jdbc обертку (http://www.zentus.com/sqlitejdbc/) это также не работает с требуемой скоростью.

Может кто-нибудь, пожалуйста, предложите мне решение, которое позволит мне просто сбросить данные в db / file и может бытьдоступ к нескольким процессам (+ потоки)?

Ответы [ 5 ]

1 голос
/ 26 марта 2012

Может кто-нибудь предложить мне решение, которое позволит мне просто записать данные в db / file и получить доступ к нескольким процессам (+ потоки)?

Если вам нужен доступ из нескольких процессов, из нескольких потоков и / или из обоих, то очень трудно достичь своей цели - 60 тыс. Записей в секунду просто потому, что дисковый ввод-вывод не очень эффективен при использовании нескольких потоков / процессов. , Любое имеющееся у вас решение должно быть сведено к той же базовой модели: только одна нить может записывать в LevelDB.

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

Процесс обработки данных будет иметь несколько потоков, которые предоставляют данные, но только один поток чтения / записи, который считывает / записывает данные в LevelDB, поэтому было бы также неплохо использовать BlockingQueue , который клиент потоки будут ставить записи в очередь, а поток данных будет читать записи из них (блокируя, если нет данных).

0 голосов
/ 15 октября 2015

Попробуйте RocksDB от Facebook. Доступ к нему можно получить из Java и из нескольких потоков. Он имеет лучшую производительность, чем LevelDB.

0 голосов
/ 30 марта 2012

Попробуйте библиотеку sqlite-jdbc http://code.google.com/p/sqlite-jdbc/ Это оболочка JDBC для нативных реализаций dll / so.

0 голосов
/ 30 марта 2012

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

Здесь клиентская библиотека для Java.

0 голосов
/ 26 марта 2012

Вы можете попробовать MySQL InnoDB.Я не могу сказать, достаточно ли это быстро для вас, но несколько процессов могут обращаться к разным кортежам данных (блокировка на строку).

...