100万行を超えるCSVファイルがあります。そのようなデータをフォーマットされた方法で含むデータベースもあります。
CSVファイルのデータとデータベースのデータを確認して確認したい。
CSVファイルからの読み取りをスレッド化し、データベースへの接続プールを使用することは有益であり、時間を短縮しますか?
Rubyはスレッド化をどの程度うまく処理しますか?
私もMongoDBを使用しています。
100万行を超えるCSVファイルがあります。そのようなデータをフォーマットされた方法で含むデータベースもあります。
CSVファイルのデータとデータベースのデータを確認して確認したい。
CSVファイルからの読み取りをスレッド化し、データベースへの接続プールを使用することは有益であり、時間を短縮しますか?
Rubyはスレッド化をどの程度うまく処理しますか?
私もMongoDBを使用しています。
誰かがこの比較を開始したときにアプリにどのように感じてもらいたいかについての詳細を知らずに言うのは難しいです。したがって、答えるために、スレッド化したい問題に関係なく、かなりうまく適用されるはずのいくつかの一般的なアドバイス。
スレッド化によって、計算時間の点でコストが下がることはありません。これにより、2つのことが並行して発生します。したがって、「ユーザーが物事を待たないため、スレッド化によってアプリが高速化される」という一般的な誤解に陥らないように注意してください。-これは真実ではなく、スレッド化は実際にはかなり複雑になります。
したがって、このDBとCSVの比較タスクを開始した場合、スレッド化によってその比較にかかる時間が短縮されることはありません。別の実行スレッドで比較を行いながら、ユーザーに「わかりました。確認します」とすぐに伝えることができます。比較が行われたときにユーザーに戻る方法を理解する必要があります。
上で言ったように、スレッド化は物事を速くしません。せいぜい、それはより効率的であるか、より良いユーザーエクスペリエンスを提供するか、あるいはその両方の方法でコンピューティングリソースを使用します。
アプリのユーザー(おそらくあなただけ)が比較の実行を待つことを気にしない場合は、複雑さを追加するだけで高速化されないため、スレッドを追加しないでください。この比較に時間がかかり、「バックグラウンドで実行」したい場合は、スレッド化が答えになる可能性があります。これを行うと、別の懸念事項が追加されることに注意してください。つまり、バックグラウンドジョブが完了したときにユーザーをどのように更新しますか?
他にも懸念事項があります。たとえば、そのワーカースレッドをスケジュールして、コンピューティングリソースを占有しないようにするにはどうすればよいですか。私の環境では、スレッドの優先順位の設定はオプションですか?その場合、それらを調整すると、コンピューティングリソースの使用にどのように影響しますか?
スレッド化とそれに伴う余分なオーバーヘッドにより、ほぼ確実に比較に時間がかかります(比較にかかる絶対時間の観点から)。本当の利点は、完了時間(比較が開始されてから完了するまでの時間)を気にせず、代わりにユーザーに対するアプリの応答性、および/または達成できる合計スループット(例:実行できる同時比較の数、およびその結果、特定の期間内に完了することができる比較の総数)。
グリーンスレッドとネイティブスレッドを参照してください。一部の言語(スレッドの実装によって異なります)は、CPU間でスレッドをスケジュールできます。
スレッディングは、必ずしもスレッドが複数の物理CPUコアで実行されることを意味するわけではありません。実際、多くの場合、スレッドは確実に実行されません。すべてのアプリのスレッドが同じ物理コアで実行されている場合、それらは実際には並列で実行されていません。並列で実行されているように見えるようにCPU時間を分割しているだけです。
これらの理由により、アプリの構造によっては、バックグラウンドタスクを別のワーカープロセス(スレッドではなくプロセス)に送信する方が簡単な場合が多く、OSレベルで使用可能なCPUコアに簡単にスケジュールできます。個別のプロセス(個別のスレッドではなく)も、アプリ内のスケジューリングに関する多くの懸念を取り除きます。これは、OS自体にスケジュールを設定する方法に関する決定を本質的にオフロードするためです。
この最後の点は非常に重要です。OSスケジューラーは、アプリで思いついたアルゴリズムよりも賢く、効率的に設計されている可能性が非常に高いです。