>从Java使用每秒60K插入键值存储

时间:2012-03-26 08:05:11

标签: sqlite nosql leveldb kyotocabinet

正在开发自定义解决方案,我需要以每秒60K记录的速度将大量数据存储到文件/数据库。此数据是传入连续流的结果。

  1. leveldb - 不能同时从多个java进程访问

  2. berkleydb / kyoto内阁:禁止商业许可

  3. sqlite:尝试了sqlite4java,但它不支持批量操作,并且没有以所需的速度执行。还尝试了jdbc包装器(http://www.zentus.com/sqlitejdbc/),这也没有以所需的速度执行。

  4. 有人可以建议我解决方案,它只允许我将数据转储到db / file并且可以被多个进程(+线程)访问吗?

5 个答案:

答案 0 :(得分:1)

  

有人可以建议我解决方案,它只允许我将数据转储到db / file并且可以被多个进程(+线程)访问吗?

如果您想要从多个进程,多个线程和/或两者进行访问,那么很难达到每秒60k记录的目标,因为当您使用多个线程/进程时磁盘I / O效率不高。您拥有的任何解决方案都需要减少到相同的基本模型:只有一个线程可以写入LevelDB。

如果您想要对LevelDB进行跨进程访问,那么您可以使用套接字或管道在进程之间编写一个非常简单的通信层。您将专用一个进程来接受来自所有客户端进程的多个套接字或管道连接,并且您将接受流数据。然后,您可以从该进程将数据写入LevelDB,让我们调用数据进程。

数据进程将有多个提供数据的线程,但只有一个读/写线程将数据读/写到LevelDB中,因此使用客户端线程所需的BlockingQueue也是一个好主意。将记录排入队列,数据线程将从中读取记录(如果没有数据则阻塞)。

答案 1 :(得分:0)

你可以试试MySQL InnoDB。我不能说它是否足够快,但多个进程可以访问不同的数据元组(每行锁定)。

答案 2 :(得分:0)

尝试Redis,速度非常快,您可以将数据保存在ram上,以后再保存到磁盘上,我认为这是一个很好的解决方案。

Here客户端lib for java。

答案 3 :(得分:0)

尝试使用sqlite-jdbc库http://code.google.com/p/sqlite-jdbc/ 它是本机dll / so实现的JDBC包装器。

答案 4 :(得分:0)

通过Facebook试试RocksDB。它可以从java和多个线程访问。它具有比LevelDB更好的性能。