1

我有一个超过 100 万行的 CSV 文件。我还有一个以格式化方式包含此类数据的数据库。

我想检查和验证CSV文件中的数据和数据库中的数据。

从 CSV 文件读取线程并使用数据库连接池是否有益/减少时间?

Ruby 处理线程的能力如何?

我也在使用 MongoDB。

4

1 回答 1

4

如果不了解有关您希望应用程序在有人启动此比较时的感觉的具体细节的更多细节,很难说。因此,为了回答,一些一般性的建议应该相当适用,无论您可能想要解决的问题是什么。

线程不会降低计算成本

就计算时间而言,线程并不会降低成本。它只是让两件事并行发生。因此,请注意,您不会陷入普遍的误解,即“线程使我的应用程序更快,因为用户无需等待。” - 这不是真的,线程实际上增加了相当多的复杂性。

因此,如果您启动此 DB 与 CSV 比较任务,线程不会使该比较花费更少的时间。它可能做的就是让您立即告诉用户“好的,我会为您检查”,同时在单独的执行线程中进行比较。您仍然必须弄清楚在比较完成后如何返回给用户。

想想你为什么要线程,而不是简单地把它当作线程是否是长任务的好解决方案

就像我上面说的,线程不会让事情变得更快。充其量,它以一种更有效的方式使用计算资源,或者提供更好的用户体验,或者两者兼而有之。

如果应用程序的用户(可能只是您)不介意等待比较运行,则不要添加线程,因为您只会增加复杂性并且不会更快。如果这种比较需要很长时间并且您宁愿“在后台进行”,那么线程可能是您的答案。请注意,如果您这样做,那么您会添加另一个问题,即在后台作业完成后如何更新用户?

线程涉及额外的开销和应用程序复杂性,然后您必须在应用程序中进行管理 - 小心翼翼

还有其他问题,例如,我如何安排该工作线程以确保它不会占用计算资源?在我的环境中设置线程优先级是否是一个选项,如果是,调整它们将如何影响计算资源的使用?

线程和所涉及的额外开销几乎肯定会使您的比较花费更长的时间(就进行比较所需的绝对时间而言)。真正的优势是,如果您不关心完成时间(比较开始和完成之间的时间),而是应用程序对用户的响应能力,和/或可以实现的总吞吐量(例如您可以运行的同时比较的数量,因此您可以在给定的时间跨度内完成的比较总数)。

线程并不能保证您的可用 CPU 内核得到有效使用

请参阅绿色线程与本机线程 - 某些语言(取决于它们的线程实现)可以跨 CPU 调度线程。

线程化并不一定意味着您的线程最终会在多个物理 CPU 内核中运行 - 事实上在许多情况下它们肯定不会。如果您的应用程序的所有线程都在同一个物理内核上运行,那么它们并不是真正并行运行的——它们只是以一种可能使它们看起来像并行运行的方式分割 CPU 时间。

由于这些原因,根据您的应用程序的结构,将后台任务发送到单独的工作进程(进程,而不是线程)通常不太复杂,可以轻松地将其调度到操作系统级别的可用 CPU 内核上。单独的进程(相对于单独的线程)也消除了应用程序中的许多调度问题,因为您基本上将有关如何调度事物的决定转移到了操作系统本身。

最后一点非常重要。操作系统调度程序极有可能比您在应用程序中提出的任何算法更智能、更高效。

于 2013-02-21T15:23:05.913 回答