所以我正在为新项目生成工作流程。在第一阶段,将有一个C / C ++代码生成大量数据(基于测试用例的二进制文件格式,大约1TB)。然后,这些数据将被导入数据库,以便与驻留在那里的另一个数据集进行比较。
我的问题是,打开数据库软件的端口并直接写入那里或将磁盘写入许多小文件(约10亿)并稍后导入数据库会更快吗? C代码将在限时集群上运行,因此需要快速完成。
答案 0 :(得分:1)
您没有指定您正在运行的数据库,因此理论上答案可能是任何事情。但是,实际上现代硬盘驱动器速度很慢:它们以大约100 MB / s的速度写入。通常,如果您将大量数据插入数据库,这是限制因素。计算机中的RAM无法帮助,因为1TB不适合RAM。但是,您可能需要使用特定于数据库的技巧,例如在单个事务中添加所有数据,以及可能已编译一次并多次调用的预处理查询。如果您使用的是固态磁盘(SSD),答案可能会有所不同,但这取决于SSD的速度。
请注意,网络接口可能会限制添加性能。千兆链路实际上意味着小于125 MB / s。因此,如果您的数据库位于另一台计算机上,则网络接口性能可能是限制因素。但是,如果您在同一台计算机上生成数据或使用十千兆位链路,那么网络链路性能不太可能成为限制因素。
然而,唯一明确的答案是在您的环境中进行测试。如果表现对您很重要,请学习基准测试的艺术。
表格是否有索引?如果是这样,那么在插入所有数据之后首先插入数据并构建索引可以提高性能。
答案 1 :(得分:1)
你必须对此进行测试才能知道。
不同的数据库产品速度不同,我们不了解数据库的硬件,如果真正的大数据上有很多索引,它可能会使一切变慢。
答案 2 :(得分:1)
虽然正确的答案应该“取决于你需要衡量”,但这是一个可以接受的确定性给出不合格答案的情况:
直接与数据库服务器通话几乎肯定会更快。
原因不仅是首先写入磁盘然后在通过网络发送数据之前再次读取数据涉及磁盘驱动器的额外延迟和带宽限制(这是不可避免的,因为每个文件至少占用页面缓存中的一个页面,十亿个文件 - 即使每个只有1个字节的内容 - 至少需要4TiB的缓冲区,因此不会有缓存)。假设快速磁盘上的顺序读取,读取4TiB数据需要3-5个小时。虽然写入磁盘实际上可能实际上是由于延迟回写而顺序发生,但在发送之前再次读取数据几乎保证不会连续(并且没有发生预读,不可能用于不同的文件)。如果幸运的话,某些操作可能仍会重叠,隐藏其延迟 - 但总而言之,这些操作不会“免费”。
虽然您可能会受到数据库接受请求或网络带宽的限制,但即使您没有添加额外的内容,这也是您始终受限制的事情。复制,至少前者是你可以很容易地优化的东西。您可以在没有任何索引的情况下将数据插入数据库,这将非常快。然后,数据库服务器可以创建您以后可能需要的任何内容。这当然可能需要一些时间,但它可能比每次更新更新索引快一个数量级(此外,谁在乎,如果重要的是您的限时工作快速完成)。
然而,更重要的是,仅仅打开和关闭,重新打开十亿个文件需要花费非常明显的时间(这涉及遍历目录层次结构,名称到inode转换,以及访问其他检查),以及金额花在访问单个文件上的时间将非常疯狂。即使在没有发生物理“搜寻”的固态硬盘上,随机访问时间也不是“零”(它们要小得多,但是10亿次,10亿次仍然是差不多3小时的额外花费求!)。