如何即时查询64Go数据库

时间:2010-07-22 13:24:30

标签: database optimization memory-management real-time

大家好,我对你有很好的挑战。以下是我的数据格式:

ID-1 COL-11 COL-12 ... COL-1P
...
ID-N COL-N1 COL-N2 ... COL-NP

ID是我的主键和索引。我只是使用ID来查询我的数据库。数据模型非常简单。

我的问题如下: 我有64Go +数据如上所述,在实时应用程序中,我需要查询我的数据库并立即检索数据。我在考虑2种解决方案,但无法设置。

首先使用sqlite或mysql。需要一个表,ID列上有一个索引。问题是数据库太大而无法获得良好的性能,特别是对于sqlite。

其次是将内存中的所有内容存储到一个巨大的哈希表中。 RAM是限制。

你还有其他建议吗?如何序列化文件系统上的所有内容,然后在每次查询时将查询的数据存储到缓存系统中?

当我说实时时,我的意思是大约100-200查询/秒。

2 个答案:

答案 0 :(得分:2)

彻底的回答会考虑数据访问模式。由于我们没有这些,我们只需假设相等的可能分布,接下来将访问一行。

我首先尝试使用真正的RDBMS(嵌入式或本地服务器),并测量性能。如果这给出了100-200个查询/秒,那么你已经完成了。

否则,如果格式很简单,那么您可以创建一个内存映射文件,并使用已排序ID列上的二进制搜索自行处理读取。操作系统将管理将磁盘从磁盘拉入内存,因此您可以免费使用经常访问的页面进行缓存。

可以通过创建单独的索引并按访问模式对行进行分组来优化缓存使用,以便将经常读取的行组合在一起(例如,放在第一位),并将通常连续读取的行放在一起相互之间(例如,相继)。这将确保您获得最大的缓存未命中率。

答案 1 :(得分:0)

考虑到数据的使用方式,您应该执行以下操作:

  1. 创建足够大的记录结构(固定大小)以包含一整行数据
  2. 将原始数据导出为遵循步骤1中定义的格式的平面文件,按ID排序数据(增量)
  3. 直接访问该文件并将缓存留给操作系统。要获得记录号N(从0开始),您将N乘以记录的大小(以字节为单位),并直接从文件中的偏移量读取记录。
  4. 由于您处于只读模式并假设您将文件存储在随机访问媒体中,因此可以很好地扩展,并且它不依赖于数据的大小:每次提取都是一次读取文件。您可以尝试一些花哨的缓存系统,但我怀疑这会在性能方面获得很多,除非您对同一数据行有很多请求(并且您使用的操作系统正在进行缓存不佳)。但请确保以只读模式打开文件,因为这有助于操作系统找出最佳的缓存机制。