2017-11-22 19 views
0

fstream.write()は、ディレクトリを削除するために実行中にスタックしません。私のHDDは、書き込みと削除を同時に行っているときにとても忙しいようです。ですから、どうすればこの滞った、write()関数のタイムアウトパラメータを避けることができますか?以下は私の手順のコードは次のとおりです。fstream.write()が長時間立ち往生しますか?

#include <fstream> 
#include <iostream> 
int main() 
{ 
    std::ios_base::sync_with_stdio(false); 
    fstream myfile = std::fstream("sample.txt", std::ios::out | std::ios::binary); 
    //Start thread remove old data 
    INT64* paramsInput = new INT64[2]; 
    char* dir = "D:\"; 
    paramsInput[0] = (INT64)dir; 
    paramsInput[1] = 50; //GB 
    _beginthreadex(Null, 0, &remove_old_data, (VOID*)paramsInput); 

    int size = 0; 
    char* data = NULL; 
    while (true) 
    { 
     data = NULL; 
     size = getData(data); //data is available every 10 ms 
     if(size > 0 && data != NULL) //size ~= 30 KB 
     { 
      myfile.write(data, size); //write data to file 
     }  
    } 
} 

UINT32 __stdcall remove_old_data(VOID* _pArguments) 
{ 
    char* dir = (char*)_pArguments[0]; 
    int freeSpaceThreshold = _pArguments[1]; 
    delete[] _pArguments; 
    while(true) 
    { 
     int curFreeSpace = GetFreeSpace(dir); 
     if(curFreeSpace < freeSpaceThreshold) 
     { 
      //remove old files and directory here 
      ClearData(dir);//File size is about 10 MB, 40,000 files in dir 
     } 
     Sleep(10000); 
    } 
} 
+2

なぜD:\ "をINT64に割り当てるのですか?コンパイラはエラーを返すべきです。また、 '_pArguments [0]'はエラーですので、voidポインタを逆参照することはできません。 –

+0

'ClearData'とは何ですか? – 1201ProgramAlarm

+0

@ 1201ProgramAlarm:ClearDataはdirの古いファイルを削除します。古いもので、もはや使用していないファイルのためにDirectory.Delete(pathFileDel、true)を呼び出すだけです... – vominhtien961476

答えて

1

いくつかがあるかもしれませんが、それは、ボトルネックがあなたのケースであり、まさに言うこと少し厳しいです。ファイルを削除すると、特に多数のファイルがあるディレクトリでいくつかの作業を行う場合に、時間がかかることがあります。ほとんどの場合、完全なドライブへの書き込みも遅くなります。新しいデータを格納する空き領域を見つけるためにOSが長くかかるため、そのチャンクは小さくなります。

1)SSDを使用します。

はここにいくつかの提案は、順不同で、パフォーマンスを向上させることがあります。これにより、ハードディスクアクセスのレイテンシはほとんどなくなります。

2)ファイルアクセスにOS API関数を使用し、バッファリングされていない書き込みを使用します。これにより、ディスクキャッシュに書き込まれたデータのみが書き込まれ、再度読み取られないため、ディレクトリ情報をキャッシュに残すことができなくなります。

3)複数のサブディレクトリを使用してデータを保存します。ディレクトリサイズが大きすぎると、ディレクトリ内のファイルへのアクセスが遅くなる可能性があります。

4)30Kデータチャンクをローカルにキャッシュし、書き込み用に複数のチャンクをキューに入れ、remove_old_dataがディレクトリをクリーンアップしていない場合にのみ書き込みます。

+0

1.私はハードディスクに約30台のカメラのデータを書きます。 SSDは、何度も書き込み/読み込み/削除する場合に最適なオプションだと思います。 – vominhtien961476

+0

2.結果を見るためにOS API関数を試します。 3.データは、date - > camera_index - > hour - > fileperminutesのような複数のサブディレクトリに格納されます。 4.各執筆に最適なサイズのデータ​​は何ですか? – vominhtien961476

+0

@ vominhtien961476 SSDは、ほとんどの遅延の原因となるシークからのレイテンシを排除します。チャンクサイズも問題ではありません。彼らはより多くの費用がかかり、より少ない容量を持ち、最終的には消耗します。非SSDの場合、一般的に、より頻繁で小さなチャンクよりも大きなブロックの数が少なくなりますが、最適なサイズは多くの要因に依存します。あなたは実験しなければならないでしょう。 – 1201ProgramAlarm

関連する問題