4

我有一些大的(200 GB 是正常的)平面数据文件,我想将它们存储在某种数据库中,以便可以快速且直观地以逻辑组织数据的方式访问它。可以将其视为大量非常长的录音,其中每个录音的长度(样本)相同,并且可以被视为一行。其中一个文件通常包含大约 100,000 条记录,每个记录长度为 2,000,000 个样本。

将这些记录作为 BLOB 数据行存储在关系数据库中很容易,但在许多情况下,我只想将整个数据集的某些列(例如,样本 1,000-2,000)加载到内存中。什么是最节省内存和时间的方法?

请不要犹豫,询问您是否需要对我的数据细节进行更多说明,以便提出建议。

编辑:澄清数据维度...一个文件包括:100,000 行(记录)乘 2,000,000 列(样本)。我研究过的大多数关系数据库在一个表中最多允许几百到几千行。再说一次,我对面向对象的数据库知之甚少,所以我有点想知道这样的东西在这里是否有帮助。当然,任何好的解决方案都是非常受欢迎的。谢谢。

编辑:澄清数据的使用......数据只能由我将编写的自定义桌面/分布式服务器应用程序访问。每个数据“集”(到目前为止我称之为 200 GB 文件)都有元数据(收集日期、过滤器、采样率、所有者等)。还有与每个记录相关的元数据(我希望它是表格中的一行,所以我可以为每条记录元数据添加列)。所有元数据都是一致的。即,如果某个记录存在特定的元数据,则该文件中的所有记录也都存在该元数据。样本本身没有元数据。每个样本是 8 位普通的二进制数据。

4

4 回答 4

2

数据库存储可能不适合大文件。是的,这是可以做到的。是的,它可以工作。但是数据库备份呢?文件内容可能不会经常更改 - 一旦添加,它们将保持不变。

我的建议是将文件存储在磁盘上,但创建一个基于数据库的索引。当文件夹/目录/等中有超过 10k 个文件时,大多数文件系统会变得古怪或缓慢。您的应用程序可以生成文件名并将元数据存储在数据库中,然后按生成的名称在磁盘上进行组织。缺点是文件内容可能无法从名称中直接看出。但是,您无需专门的数据库备份插件和复杂的分区增量备份方案即可轻松备份更改的文件。此外,文件内的查找操作变得更加简单(向前跳、倒带等)。在文件系统中对这些操作的支持通常比在数据库中更好。

于 2011-12-29T16:58:09.200 回答
1

我想知道是什么让您认为 RDBMS 将仅限于数千行;没有理由会出现这种情况。

此外,至少某些数据库(以 Oracle 为例)确实允许直接访问部分 LOB 数据,而无需加载完整的 LOB,如果您只知道您想要的偏移量和长度。因此,您可以有一个包含一些可搜索元数据的表,然后是 LOB 列,如果需要,还有一个包含 LOB 内容元数据的附加元数据表,这样您就可以使用某种关键字->(偏移量,长度)关系用于部分加载 LOB。

有点呼应这里的另一篇文章,增量备份(您可能希望在这里拥有)对于数据库来说不太可行(好吧,可以,但至少在我的经验中往往附有令人讨厌的价格标签)。

于 2011-12-29T21:23:18.583 回答
0

每个样本有多大,每个录音有多大?您是说每个录音是 2,000,000 个样本,还是每个文件都是?(无论哪种方式都可以阅读)

如果是 200 万个样本组成 200 GB,那么每个样本约为 10 K,每个记录是 200K(每个文件有 100,000 个,即每个记录 20 个样本)?

这似乎是一个非常合理的大小,可以放在数据库中而不是磁盘上的文件中。

至于仅将某个范围加载到内存中,如果您已经索引了示例 id,那么您可以非常快速地仅查询您想要的子集,仅从数据库查询结果中将该范围加载到内存中。

于 2011-12-29T16:44:48.803 回答
0

我认为 Microsoft SQL 在与文件流存储结合使用时使用 varbinary(MAX) 字段类型可以满足您的需求。

阅读TechNet以获得更深入的信息:(http://technet.microsoft.com/en-us/library/bb933993.aspx)。

基本上,您可以在数据库中正常输入任何描述性字段,但实际的 BLOB 存储在 NTFS 中,由 SQL 引擎控制,并且大小仅受 NTFS 文件系统的限制。

希望这会有所帮助——我知道它会在我的脑海中引发各种可能性。;-)

于 2011-12-29T22:07:10.940 回答