これからはquestion私は(複数の)QFile
を使用して適切な非同期ファイルI/Oを実装できるかどうかを確認することにしました。 1つのファイル上で動作するオブジェクト「QFile
」の「プール」を使用して、それぞれオブジェクトで実行されるQtConcurrent
APIを介して要求をディスパッチすることです。タスクが終了すると、結果が出力され(読み取りの場合)、QFile
オブジェクトがプールに戻されます。私の最初のテストは、これが有効なアプローチであり、実際には同時の読み書き操作(例えば、書き込み中に読み込み)を可能にし、さらに性能を助けることができることを示しています。OSレベルのファイルQtプラットフォームのI/Oロック
明らかな問題は、ファイルの同じセグメントのの読み取りと書き込みです。何が起きているのかを見るために、私は上記の方法を使って状況を設定し、ファイルの同じ部分に狂って書いたり読んだりするようにしました。可能性のある「腐敗」を見つけ出すために、私はセグメントの始めと終わりに数字を増やしています。そのような場合に部分的に書き込まれたデータを読み込んだため、読み込みが最初から最後まで異なる数字を読み取ると、実際の状況では破損したデータを読み取ることができるという考えがあります。
読み取りと書き込みが重複していたため、非同期的に発生していることがわかっていましたが、出力が「間違っていました」ということは一度もありませんでした。これは基本的には、読み取りが部分的に書き込まれたデータを読み取ることはないということを意味少なくともWindowsでは。 QIODevice::Unbuffered
フラグを使用しても変更されませんでした。
OSレベルで何らかのロックが行われていると思われますが、この想定が間違っていると私を修正してください。私は、書き込み開始後に開始された読み出しは、書き込みが完了する前に終了する可能性があるという事実に基づいています。 Qtがサポートしているプラットフォーム(主にPOSIXとAndroidをベースにしているプラットフォーム)の場合にはこれが当てはまるかどうか、あるいは私自身が実際にロック機構を実装する必要があるのだろうかと思っていました。これらの状況は、書き込まれているセグメントから読み込みを遅らせるためです。
あなたの質問には、[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のようなにおいを開始します。ファイルの大きさはどれくらいですか?何が入ってるの?なぜあなたは小さな塊でそれにアクセスしますか?あなたはデータベースを再実装しようとしていますか?あなたがsqliteを使用するほうが良いと思うように見えます。それは数日、または数ヶ月、あるいは1年後にも泡立てることができる何かよりも**弾力性とテスト力があります。 –
@KubaOber私は 'X'について以前に質問してみましたが、誰も答えられることができなかったため、私は自分自身でそれに遭遇する特定の問題について尋ねました。基本的に私はデータベースを再実装していない、私はそれを実装しています。実際にグラフデータベース。私はそこに多くを試みたが、私のニーズに合ったものはなかった。それらはJavaベースであり、膨大なメモリオーバーヘッドを持ち、遅すぎるか、必要なもの(例えば、効率的なサブグラフ)をサポートしていませんでした。私はバックエンドとしてSQLiteを使用しようとしましたが、それは辛いだけ遅く、ディスクスペースも大量に消費します。 – Resurrection
あなたのデータベースについて深刻なことは分かりませんが、もし私がそれをやっていたら、できるだけ多くのSQLiteを再利用するでしょう。非常に最小限のページャー、おそらくBツリー。これらのレイヤーは非常に高速で、依存することができます。 –