【问题标题】:Database or other method of storing and dynamically accessing HUGE binary objects数据库或其他存储和动态访问巨大二进制对象的方法
【发布时间】:2012-01-30 00:20:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 不确定这应该是评论还是答案,但相关问题stackoverflow.com/questions/7963656/…stackoverflow.com/questions/8952/…可能会提供一些启示。
  • 以什么方式访问数据?您是否正在编写桌面应用程序、网站,并计划使用 Excel?关于文件和样本存在哪些元数据?架构是否一致 - 即每个文件和样本是否具有相似的字段?
  • @MarkBannister - 这些问题的答案对于在数据库中存储 BLOB 数据的一般情况有些帮助,但是,我希望按列访问数据可能会使我的情况有所不同。也许不是。

标签: sql database rdbms large-files object-oriented-database


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 啊,该死的...我的意思是成千上万的列。我将编辑编辑。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 对不起,我可能在里面放了太多字。第一段的最后一句应该读作:“一个文件有 100,000 个记录,每个记录有 2,000,000 个样本。”
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 2011-03-26
      • 2017-03-25
      • 2021-11-15
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      相关资源
      最近更新 更多