0

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

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

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

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

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

4

5 回答 5

1

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

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

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

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

于 2012-03-26T13:30:20.640 回答
0

试试 sqlite-jdbc 库http://code.google.com/p/sqlite-jdbc/ 它是原生 dll/so 实现的 JDBC 包装器。

于 2012-03-30T14:08:11.443 回答
0

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

于 2012-03-26T08:08:27.670 回答
0

试试Redis,速度非常快,您可以将数据保存在 ram 上,然后再保存到磁盘,我认为很好的解决了您的问题。

这里是 java 的客户端库。

于 2012-03-29T23:00:55.717 回答
0

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

于 2015-10-15T14:33:10.583 回答