Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。200件2Qtで開発をしている者です。大量のウィジェットが存在しており、そのウィジェットごとにデータが格納されているとします。極端な話、そのウィジェット毎に、保存データのファイルを作成するのは、処理としてはあり得ない方法でしょうか?というのは、アプリを立ち上げた際に、一気にロードをするのではなくて、GUI上の何らかのアクションが生じた時に、そのウィジェットに対応したものを、その都度それに応じたファイルをロードするようにしたらいいのではないかと考えました。今までは全ての情報を、シーケンスで一つ~三つのファイルにまとめてそれを取り出したいデータごとに吸い出していました。a,b,cというファイルを、ひとつのアプリで、aのファイルを選べばaのデータが、bを選べばbのデータが、cを選べばcのデータがそれぞれ吸い出されるようにしていたのです。今回、aをさらに分割し、aというデータが保持しているウィジェット1についての情報を、a-1ファイルへ、ウィジェット2についての情報をa-2ファイルへと、個別化してみたいと考えています。同様に、bが持っているウィジェット1についての情報は、b-1ファイルへ、以下略。分割しまくるというのは、危険な行為のように思えてしまいます。自分には、ファイルは多くても三~四という先入観があり、openとcloseを繰り返し、後は名前に番号さえ入れてやれば、理論上は大量に増やせるのはわかります。データの永続化については保存と取り出しが出来ただけで感動していたのですが、かなり大切な部分だという意識が高まってきました。「一つのアプリの、あるデータが保持しているすべての情報に対して、その情報を一定のルール区切り毎に(1000のウィジェットが保有しているデータなら1000のファイルを)分割して、その数だけ作成する事」は、worseな選択肢でしょうか。データベースはあまり利用したくないです。ちなみに多分多くとも100~300になろうと思いますが、場合によってはファイルの量が増えすぎて、検索に支障が出て、かえって時間がかかったりしてしまいそうな気がしています。これはやめておいたほうがいいでしょうか?ぼやき:seekについてひょっとして、こういうことをしないで済むために、ファイルを全部読み込むことなく、部分的な高速アクセスを図る方法が、seekというものなのでしょうか?一回一回分割したファイルにアクセスするのではなく、特定のseek位置へ移動してから読み込むべきということでしょうか。File系列の話の際には、よく見るメソッドですけれども、今まで利用する機会がありませんでした。こちらが使えるのならば、こちらを検討した方がいいでしょうか?よく使い方がわかりませんが、QFileも、保持中のデータをマップ化して、オフセット指定をして特定のデータのみにアクセスできるという方法があると耳にしたことがあります。こちらを検討したほうがいいかなぁともかんがえています。公式を見ているのですが、ランダムアクセスサポートという事で、大きな間違いではなさそうです。QDataStreamで登録しているのに、QIODeviceしか[seek][3]メソッドはないし・・・。いろんなものがごぎゃまぜになっているデータのなかからseekするというのも、試さず嫌いで敬遠していました。質問も質問としてまとまる気にならず、実際自分は、QFile,QIODevice,QDataStream,QTextStream,pythonに引き直すと、open(),io(),pickle()?等の明確な違いがあまりわからず、教科書通りに処理していました。ぼやきのあとで今改めて考えてみますと、fileは、データが入っているポイントを探し当てる物。それにに焦点を当てるためのクラス。io系のメソッドは取り出された一枚のデータが書かれているシートを走査して、情報を書き込んだり、読み取るための、ある意味コピー機のフラッシュのような役目。次に、pickle等は、ioがよみとった情報を、バイトコードやテキストファイルに変換し、fileに埋め込む役目をしているという理解で問題ないでしょうか?とすると、ioがseekメソッドをもつというのもわかります。seekは、ioという段階にありながらも、情報をよみとれるというのがいまいちピンときません。読み取る相手がバイト列か単なるテキスト文字列かは、Dataの種類によって異なる気も致します。初心者の頃からもやもやしてました。聞きたいこと2聞きたいことで聞いたことを代わりに行うのがseekメソッドなのでしょうか?fileと、io,そしてpickle等の永続化3点セットの関係性を、氷解させてくれるようないい説明、たとえ噺などはございませんか?まとめまとめると、自分のやろうとしているのは、fileのような、データの入っている箱を選ぶ段階で、個別具体的にするべきか?あるいは、データの入っている箱を選ぶ段階ではなく、その箱を見付けた後で、その箱の中から都合の良いデータを選ぶ処理をするべきか?という話に要約されるのではないかなとおもうようになりました。一言でいうと、このような疑問になりますが、どなたか詳しい方おねがいいたします。個の銅バッジ丁寧に答えていただきありがとうございました。おかげ様でずっともやもやしていたものがスッと解消した気がいたします。質問をしてみて大変よかったです。票5ファイルにデータを保存するというのは、管理者以外からの入力がないという条件であれば有力な方法です。Qtで開発しているということはデスクトップアプリで、データベースはあまり利用したくないということはこの条件に該当すると思います。いうケースでは、MySQLをインストールするのは手間です。それに、ファイルだとエディタで簡単に修正できるし、gitで履歴管理もできます。データを約10万件のファイルにしてlinuxサーバーで実際に運用していますが、処理時間は以下のようなもので、処理が単純なだけデータベースを使うより速いです。2回同じコマンドを入力しているのは、1回目はリブートしてキャッシュがなされていない場合で、2回目はキャッシュされている場合です。0m0.000sファイルは必要であれば、必要なだけ作ったらいいと思います。10万個であれば何の問題もないし100万個になってもlsが使いづらくなるぐらいで処理速度自体は問題はないです。それに、ひとつのフォルダのファイル数が多くなりすぎれば階層化すればいいだけの話です。fileをアップデート毎に作るのも可能で、必ずしもdatabaseにする必要はないし、大量に一括で処理する場合はdatabaseよりもfileベースの方が処理が速いケースも多いです。聞きたいこと2についてpythonのpickleは非常に高速です。Qiitaで「C#のLinqを使っているのならPythonの方が2倍速くなる」という記事を書いた時に測ったら、全件のデータがほしいのならデータベースを使うより20倍以上速いという結果になりました。Pythonの場合は、データを保存する必要があればpickleで保存ということを基本にして間違いないと思います。メモリーもディスクも十分な容量が使える時代にわざわざ手間のかかるseekを使うことはあまりないと思います。|3似たようなことを考えたことがありますが、基本的にこういう案件ではデータベースを使用するほうが良い結果が得られると思います。下記ではいくつかの項目について確認していきます。アクセス特性アクセスには大きく分けてシーケンシャルアクセス(つまりファイルの最初から最後まで読み取る)とランダムアクセス(ある特定の部位のみを読み取る)という方法があると思います。ファイルは原則としてシーケンシャルアクセスにしか向いていません。設問者の言う通りseekメソッドはファイルにおけるランダムアクセスを可能としますが、そのメソッドはどのバイトから読みだすかというバイト単位でしか指定できません。これでは実際のアプリケーションを作るときに非常に困ったことになるでしょう。(例えばウィジェットBはファイルfaを65536byteからseekし32768byteだけ読みだすとプログラミングできなくもないですが、ファイルのバイト数がずれただけでこのプログラムは破綻します)。seekメソッドでは実用的なクエリ(必要なデータを抽出する)ということに向きません。不可能とまでは言わないですが制御が大変です。fileか1fileかdatabaseなのですが、1fileというのは上記のファイルの特性から、遅延してロードするとかの用途にあまり向いていません。(ランダムアクセスが不便なので遅延してロードするには向かない。)次に問題となるのが、どのタイミングでクエリ(つまりどのウィジェットにどのデータを割り当てるかを仕分ける作業)を行うかです。fileに分割しておけば、アプリケーション実行時にクエリを実行する必要がないので高速でしょう。fileは処理の最適化として機能すると思います。データが複数のファイルに分断されます。データが複数に分断することが危険であると設問者も指摘していますが、何が危険なのでしょうか?データの管理が手間になります。共有可能なデータもすべて分断されますし、プログラムのアップデート毎にデータの整合性に神経を使うことになります。そのような課題を解決するために世の中にdatabaseというものが存在しています。databaseにできて1fileにできないこと、それはインデックスによるランダムアクセスが可能だということです。ウィジェットAに使用したいデータ範囲をdatabaseに定義してインデックスを使用すれば、そのウィジェットに必要なデータのみを抽出するということが簡単かつ高速に行うことができます。fileを簡単に生成しておくこともできます。fileからdatabaseを構築することは手間がかかります。fileをアップデート毎に作れるようにしておくのが最適かと。下記はデータベース(SQL)に関する参考文献です。https://use-the-index-luke.com/ja聞きたいこと2についてpythonのfileは、HDDに格納されているファイルにアクセスするためのオブジェクト。通常はpythonのioと連動してファイルに対してシーケンシャルにアクセスする。pythonのioは、データをストリーム(≒シーケンシャルアクセス的な読み書きを行えるオブジェクト)として扱うためのもの。.seekメソッドという頭出しのような機能もあるがおまけです。pythonのpickleは、pythonが扱えるオブジェクトを高速にローディングし効率的に圧縮できるようにバイナリ化したファイルのこと。pythonを使うなら通常のfileよりもpickleのほうが断然速いのでおすすめです。databaseは使わずに1fileだけで処理したいのならば、まずはpickle化することを検討したほうがいいかもしれないですね。(アプリケーションのスタートアップ時に読み込んで、あとはそのデータをウィジェットに配給するプログラムを書くイメージ)pythonの先生に見せたら怒られるかもしれませんが、上記のようなイメージでそれほど外れていないはずです。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。いうエラー1PySideで開発したもののそのあとどうすればいいかわからない。1マルチスレッドをデータロード時に利用するのはベストプラクティスですか?0QApplication,QClipboard,mimedataで、貼り付けをした後にデータを復元すると、必ずテキストが黒くなる。0自分のデータと世界地図上の情報をリンクさせるのにCartopyは適切な手段でしょうか。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。