最好的方式来存储/当他们的元数据是在一个SQL数据库中检索数百万个文件(Best way to st

2019-07-31 21:36发布

我有这回事最初产生3-4亿的PDF文件,并继续以80K /天的速度的过程。 他们会非常小(50K)各的,但我担心的是如何管理文件我生成,便于查找的总质量。 一些细节:

  1. 我还会有一些其他措施来运行一次已生成的文件,而且会有参加几台服务器,所以我需要为他们产生观看的文件。
  2. 一旦生成,文件将可虽然查找过程中,我已经写了。 从本质上讲,我需要根据订单数量,这是每个文件独特的拉他们。
  3. 在任何时候,现有的订单数量可能重新提交,生成的文件将需要覆盖原件。

我本来打算写的所有这些文件在NAS的单一目录,但我知道这可能不是一个好主意,因为有几百万他们和Windows可能不处理百万文件的查找非常优雅。 我在寻找一些建议:

  1. 是一个单一的文件夹好吗? 该文件将不会被列 - 他们只会使用与我已经确定的文件名有System.IO.File检索。
  2. 如果我做一个文件夹,我可以看为与System.IO.DirectoryWatcher新文件,甚至是许多文件,还是会开始变得迟缓与多文件?
  3. 他们应该被存储在一个SQL Server数据库,而不是BLOB的? 因为我需要一个参考值,对它们进行检索,这也许会更有意义。

谢谢你的想法!

Answer 1:

我最好组特定的子文件夹中的文件,并尝试在一些业务逻辑的方式来组织他们(子文件夹)。 在某一天也许做的所有文件? 在每天的6小时内? 或文件的每一个#,我会说几个1000最大。 (有可能是一个理想的数字摆在那里,希望有人将它张贴。)

不要将文件不断老化和被删除? 如果是这样,排序和文件是可删除的数据块。 如果没有,我可以是你的硬件供应商?

有一个关于在数据库中存储的文件双方的论点。

  • 一方面,你得到增强的安全性,“因为它是更尴尬拉从数据库中的文件; 在另一方面,你可能表现较差,“因为它是更尴尬,从DB拉文件。
  • 在DB,您不必担心每个文件夹,部门,集群NAS有多少文件,不管是谁 - 这就是DB的问题,而且很可能他们已经得到了一个很好的实现。 在另一面,这将是更难管理/查看数据,因为它会是在一个表中的bazillion斑点,并且,好了,呸。 (你可以划分基于前面提到的业务逻辑表,这将使删除或存档无限更容易执行。也就是说,或许分区视图,因为表分区为1000个分区的限制。)
  • SQL Server 2008中具有FILESTREAM数据类型; 我不很了解,可能是值得研究的。

最后一点担心的是保持“一致”的数据。 如果数据库存储与路径/文件命名为沿着该文件的信息,以及文件被移动,你可以得到完全畅饮。



Answer 2:

要回答你的问题:

  1. 我不会把它们存储在一个文件夹中。 由于机会是在某些时候,你会想看看磁盘,而不是一些其他的方式在实际文件。
    相反,为什么不把它们存储在单独的目录,分成1000个批次? 可能使用ID作为关键字。
  2. 许多文件可能会淹没DirectorWatcher,所以有些人会丢失。 我已经在过去使用此,和过去的某个点(当场打死百),我发现它开始怀念文件。 可能使用传入的文件不同的目录,然后处理这个每隔一段时间。 那么这可以触发过程更新原始。
  3. 我不会存储元数据文件存储在数据库中,但肯定在数据库中。


Answer 3:

您可以轻松地将文件组织到多个文件夹中,而无需通过业务逻辑,或者为了每一天,这是特别好,如果那样的顺序将是“块状”(许多命中一个文件夹中,很少在别人)来做到这一点。

要做到这一点最简单的方法是创建一个文件名唯一的哈希值,所以,也许你得到的东西是这样的:

sf394fgr90rtfofrpo98tx.pdf

然后打破这一成两个字符块,你会得到这样的:

sf/39/4f/gr/90/rt/fo/fr/po/98/tx.pdf

正如你所看到的,它给你一个深刻的目录树,你可以轻松地浏览。

有了好的哈希函数,这将是非常均匀的分布,你将永远不会得到每个目录超过1296项。 如果你得到一个碰撞(这应该是极为罕见的),只是增加了一些到最后:tx.pdf,tx_1.pdf,tx_2.pdf。 同样,在这样大的哈希冲突应该是极为罕见的,这样一种丛生你,因为这是一个非问题。

你说,这些文件进行数字签名,所以你可能有散列,你需要正确的,在签名字符串的形式。



Answer 4:

1)一个简单的文件夹可能有单独的索引足够快,但因为它的琐碎把它放在子目录这将让自己浏览刚刚做的能力。
所以,现在你要弄清楚你的命名约定。 虽然我通常建议哈希得到一个甚至ID的分布,但如你做了这么多,它可能是有意义的使用你已经得到的值。 如果你有一个订单号码,你有一个时间戳吗? 如果是这样,只是前面加上时间戳的订单号。

要知道,如果你使用订单ID,你可能会遇到http://en.wikipedia.org/wiki/Benford%27s_law



Answer 5:

确定子目录的一些逻辑顺序,并将它们存储在一个文件夹中的不超过512页左右的文件块。

不要将文件存储在数据库中。 数据库是数据,文件服务器的文件。 它们存储在文件服务器上,而是存储在数据库的路径和检索信息。



Answer 6:

你需要对其进行测试。 所有这些解决方案依赖于底层的文件系统。 有些文件系统可以处理庞大的目录,有些却不能。 一些文件系统索引他们的目录,有的没有(这两点都没有必然的关系)。

在对目录树打破东西有合理机会成为高性能,仅仅是因为,在年底,各个目录往往有几整体条目。 这适用于大多数文件系统的任何,只是因为即使是“愚蠢的”一个正在为你的文件线性目录搜索可以相当迅速搜寻几百项。

如果文件系统索引目录(比如说,一个B树,或者干脆选它在内部它实际上是在此背景下,同样的事情),那么目录大小并不太重要,但也有一些工具可能会抱怨(加载Windows资源管理器窗口用4M的文件,谁知道会发生什么)。

所以,我会研究你的计划的操作系统和文件系统选项,并对其进行测试,看看哪个最适合你。



Answer 7:

为什么不考虑被转换成PDF格式为DB(BLOB),因此后发优势存储所有这些文件:

  1. 我beleive你不会有与OS I / O处理照片直接,并保留一切到DB。
  2. 无需哈希命名
  3. 轻松备份和维护


Answer 8:

当使用一个数据库来存储你的文件,特别是小文件的开销要小。 但你也可以做这样的事情:

DELETE FROM BLOBTABLE WHERE NAME LIKE '<whatever>'

或者当你有一个有效期,或要刷新一个文件,您可以通过将其删除:

DELETE FROM BLOBTABLE WHERE CREATIONDATE < ...
etc...


Answer 9:

题:

这些文件为什么要生成和PDF文件存储在哪里?

如果他们能够产生,为什么不保留数据库中的数据,并在需要时生成它们的飞行? 这意味着你可以搜索的需要的搜索不管怎样,不会对磁盘​​上​​的文件的实际数据。 这样,在需要时,无需重新任何你还可以更新PDF模板?



Answer 10:

1)这正好完全相反,我通常是说教,而你可能想将它们存储在一个SQL数据库,因为它们是真实地小文件。 SQL Server还可以让您快速,轻松地找到你需要没有通常与列举这样一个大目录相关的疯狂捣毁磁盘中的文件。

2)存储他们所有的目录和与Windows索引服务(无论是不寒而栗他们索引),或在SQLServer,创建你自己的指数,这将包含文件名和完整路径。 我建议将它们存储在不同的目录,只有几万每个文件。 也许你可以使用顺序为年作为文件夹名称?

不管他们如何存储- 不扫描目录中查找文件 -你肯定会需要有某种形式的指数。

希望这可以帮助!



Answer 11:

我的文件数据库包含了超过400万的文件夹,每个文件夹中的许多文件。

才刚刚扔在一个目录下的所有文件夹。 NTFS可以处理这没有任何问题,而像ROBOCOPY先进的工具可以帮助当你需要移动它。

只要确保你可以索引文件,无需扫描。 我在一个MySQL数据库折腾我的索引这样做。

因此,要获得一个文件我在一些元数据搜索的MySQL数据库,并得到一个指数。 然后,我用这个指标来直接读取文件。 对我来说很好缩放至今。 但请注意,您将目光转向一切都变成随机访问,因此随机读/写。 这是硬盘性能较差,但幸运的SSD将有很大的帮助。

另外,我也不会在文件折腾到MySQL数据库。 你将不能够做网络而无需客户端,了解MySQL的读取。 现在,我可以使用任何程序,因为我可以只使用其网络URL通过网络访问的任何文件。



Answer 12:

我觉得像许多其他人所说的,你应该做的子文件夹,但在某种程度上,你可以通过代码查找数据。 例如,如果日期时间的工作,利用这一点。 从读什么,你说,这似乎有某种形式的层次结构的报告(每日,每周,每日X报告,每小时ÿ报告等),我想看看什么时候,为什么生成报告的结构和构建我的目录了这种方式。



文章来源: Best way to store/retrieve millions of files when their meta-data is in a SQL Database