4

Windows 7、64 ビット、8 コアで VS2012 を使用して、ローカル ハード ドライブから .csv ファイルを読み込んでいます。

私が読んでいるファイルには 50,000 行以上あり、各行には 200 以上の属性があるため、データを読み取って対応する変数に渡すには非常に時間がかかります。したがって、各スレッドがファイルの一部を読み取るマルチスレッドで高速化できるかどうか疑問に思っています。

私はそれについてグーグルで調べたところ、ハードドライブはマルチスレッド化されていないため、複数のスレッドを使用すると実際には速度が低下すると誰かが言っていることがわかりましたこれは本当ですか?

複数のスレッドでファイルを読み取ることができる場合、誰かが私が学ぶことができる例を教えてくれますか?

また、CPU コアにスレッドまたはタスクを明示的に割り当てることは可能ですか?

最後の質問: Python で同じファイルを読みましたが、数秒で完了しました。Python が C++ よりも高速に読み取れる理由を教えてください。

4

1 に答える 1

2

ファイルを読み取るには、任意の言語または OS で syscall を作成する必要があります。これは、基盤となるオペレーティング システムを呼び出し、ファイルの内容がメモリに格納されるのを待つことを意味します (OS のセキュリティ チェックとそのすべてに合格すると仮定します)。 )。ファイルの読み取りをマルチスレッド化すると、実際には速度が低下します。これは、プログラムの実行から抜け出し、制御をオペレーティングシステムに渡すシステムコールが増えるためです。

そのため、最善の提案は hyde です。必要に応じて、ファイルの解析を複数のスレッドに分割することをお勧めします。ただし、そのようなサイズのファイルを数秒で解析できる場合は、あまり価値がないと思います。たとえば、グラフィカル アプリケーションを実行している場合、UI がフリーズしないように、ファイルの読み込み用に別のスレッドを保持する必要があります。

速度の問題については、主に 2 つの問題があると思います。まず、Pythonはデフォルトでメモリバッファを介してファイルを読み取るため、実行速度が向上すると思われます。ファイルの読み取りをバッファリングできる場合 (syscall の回数を減らすことができるため)、パフォーマンスがいくらか向上する可能性があります。もう 1 つの問題は、データをロード/解析するために Python と C++ で使用しているデータ構造です。コードを知らなければ、具体的な提案はできませんが、プログラムに適用可能なさまざまなデータ構造について調査/検討するのに少し時間がかかると役立つ場合があります。Python と C++ のデータ構造のパフォーマンス プロファイルは大きく異なるため、Python で適切に機能するものを C++ で使用すると、はるかに悪い選択になる可能性があることに注意してください。

編集: http://www.cplusplus.com/reference/の C++ STL でファイル バッファリングを使用する簡単なサンプル

 // read a file into buffer - sgetn() example
 #include <iostream>     // std::cout, std::streambuf, std::streamsize
 #include <fstream>      // std::ifstream

 int main () {
   char* contents;
   std::ifstream istr ("test.txt");

   if (istr) {
     std::streambuf * pbuf = istr.rdbuf();
     std::streamsize size = pbuf->pubseekoff(0,istr.end);
     pbuf->pubseekoff(0,istr.beg);       // rewind
     contents = new char [size];
     pbuf->sgetn (contents,size);
     istr.close();
     std::cout.write (contents,size);
   }
   return 0;
 }
于 2013-08-01T15:30:03.137 に答える