我有一个超过100万行的CSV文件。我还有一个数据库,以格式化的方式包含这些数据。
我想检查并验证CSV文件中的数据和数据库中的数据。
是否有益/缩短从CSV文件读取线程并使用连接池到数据库的时间?
Ruby如何处理线程?
我也在使用MongoDB。
答案 0 :(得分:4)
如果不了解有关某人发起此比较时您希望该应用感受到的具体细节,则很难说。因此,要回答一些一般性建议,无论您可能想要解决的问题如何都应该适用。
线程在计算时间方面不会降低成本。它只是让两件事并行发生。所以,要注意你没有陷入常见的误解,“线程使我的应用更快,因为用户不等待事情。” - 事实并非如此,线程实际上增加了相当多的复杂性。
因此,如果您启动此DB与CSV比较任务,则线程不会使该比较花费更少的时间。它可能做的是让你告诉用户,“好吧,我会立即为你检查”,同时在一个单独的执行线程中进行比较。您仍需要弄清楚在比较完成后如何回复用户。
就像我上面所说的那样,线程化不会让事情变得更快。充其量,它以更高效的方式使用计算资源,或者提供更好的用户体验,或两者兼而有之。
如果应用程序的用户(可能只是你)不介意等待比较运行,那么不要添加线程,因为你只是要增加复杂性而且不会更快。如果这种比较需要很长时间,而你宁愿“在后台进行”,那么线程可能可以成为你的答案。请注意,如果您这样做,那么您将添加另一个问题,即在后台作业完成后如何更新用户?
还有其他问题,例如,如何安排该工作线程以确保它不会占用计算资源?线程优先级的设置是否在我的环境中是一个选项,如果是,那么调整它们将如何影响计算资源的使用?
线程和所涉及的额外开销几乎肯定会使您的比较变得更长(就进行比较所花费的绝对时间而言)。真正的好处是,如果您不关心完成时间(比较开始和完成之间的时间),而是关注应用程序对用户的响应性,和/或可以实现的总吞吐量(例如,您可以运行的同时比较的数量,因此您可以在给定的时间跨度内完成比较的总数。)
请参阅Green Threads与本机线程 - 某些语言(取决于其线程实现)可以跨CPU调度线程。
线程并不一定意味着您的线程最终会在多个物理CPU核心中运行 - 实际上在很多情况下它们肯定不会。如果所有应用程序的线程都在同一个物理内核上运行,那么它们并不是真正并行运行 - 它们只是以一种可能使它们看起来像并行运行的方式分配CPU时间。
由于这些原因,根据应用程序的结构,将后台任务发送到单独的工作人员进程(进程,而不是线程)通常不那么复杂,可以轻松地将其安排到可用的CPU上操作系统级别的核心。单独的进程(与单独的线程相对)也消除了应用程序中的许多调度问题,因为您实际上卸载了有关如何将内容安排到操作系统本身的决定。
最后一点非常重要。操作系统调度程序非常可能比您在应用程序中提出的算法更智能,更高效。