4

私のアプリケーションは、ファイルに保存されているデータを読み取り、変数または配列の値を取得して、それらを処理する必要があります。

私の質問は、ファイルからデータをすばやく簡単に取得できるファイル形式はどれかということです。

.xml 、 .ini 、または単純な .txt ファイルを使用することを考えていました。しかし、.txt ファイルを読み取るには、多くの if または else 条件を含む多くのコードを記述する必要があります。

.ini と .xml の使い方がわかりません。しかし、それらがより良く高速になる場合は、最初にそれらを学び、次にそれらを使用します. よろしくお願いします。

4

5 に答える 5

5

ここであなたが示しているのは、生のパフォーマンスはシステムの堅牢性よりも優先されていないということだと思います。

名前とペアになった値である単純なデータの場合、おそらく ini が最も単純なソリューションです。より複雑な構造化データは、XML へと導きます。C# で作業している場合 (したがって .Net であると見なされます) の以前の質問によると、XML は .Net ライブラリに組み込まれているため、一般的に好まれます。xml はより柔軟で、プログラムのニーズに合わせて変更できるため、個人的にはファイル標準として ini よりも xml をお勧めします。XML ライブラリを学習するにはさらに多くの作業が必要になりますが、すぐに効果があり、標準化されたシステムです。

テキストは高速かもしれませんが、速度のために堅牢な解析動作の膨大な量を犠牲にするか、高速の専用パーサーの開発と保守にはるかに多くの工数を費やすことになります。

xml ファイルの読み取りに関するリファレンス: (.Net ライブラリでネイティブにサポートされています)

ini ファイルの読み込みに関するリファレンス: (.Net ライブラリではネイティブにサポートされていません)

于 2013-02-06T20:50:30.413 に答える
4

表形式のデータの場合は、おそらく CSV (カンマ区切り値) ファイルを使用する方が高速です。

構造化されたデータ (ツリーなど) の場合は、より高速な C# の XML パーサーを使用できます (ただし、ある程度の学習努力が必要になります)。

データが辞書のようなものである場合は、INI の方が適しています。アプリケーションのデータの種類に大きく依存します

または、RDBMS を気にしない場合は、それがより適切なオプションです。通常、優れた RDBMS は、大量のデータを処理し、非常に高速に読み取るように最適化されています。

于 2013-02-06T20:20:42.757 に答える
1

バイナリ ファイル (自分で読み取ったり変更したりできないファイル) を使用してもかまわない場合は、数値の配列をファイルにシリアル化し、ファイルから逆シリアル化するのが最も高速です。

データがより効率的に格納され、読み取りに必要な I/O 操作が少なくなるため、ファイルは小さくなります。また、最小限の解析 (本当に最小限) が必要になるため、読み取りが非常に高速になります。

番号が次の場所にあるとします。

int[] numbers = ..... ;

次のコードを使用してファイルに保存します。

using(var file = new FileStream(filename, FileMode.Create))
{
    var formatter = new BinaryFormatter();
    formatter.Serialize(numbers, file);
}

ファイルからデータを読み取るには、ファイルを開いて次を使用します。

numbers = (int[])formatter.Deserialize(file);
于 2013-02-06T20:37:48.650 に答える
1

@Ian T. Smallがファイルタイプの違いにうまく対処したと思います。

@Aniket に対する @Shaharyar の応答を考慮して、私たちが持っている限られた範囲の情報を考慮して、解決策として DBMS の会話に追加したかっただけです。

データセットは増えますか? エントリはどのように「多くのフィールド」を構成しますか?

r-dbms (リレーショナル) が大規模なデータ セットに対する潜在的なソリューションであることに同意します。次の質問は、大規模なデータ セットとは何かです。

@Shaharyarが多くのフィールドを言うとき、
私は10または100のフィールドについて話しているのですか?
=> 10 ~ 20 個のフィールドでは、r-DBMS のオーバーヘッド (インストール サイズ、CRUD コードなど) は必要ありません。オブジェクトの XML シリアル化は、はるかに単純です。

=>不確定な数のフィールドがある場合(つまり、時間の経過とともにフィールド数が増加する場合)、ACID準拠が必要な場合、または何百ものフィールドがある場合、@Aniketスポットオンと言えます。

@Matt の NoSQL の提案も素晴らしいです。高スループット (数秒ごとの更新に必要なスループットよりもはるかに高い) と簡素化されたシリアライゼーション/デシリアライゼーションを提供します。

ここで見られる唯一の欠点は、アプリケーションのサイズ/構成です。(軽量で構成が簡単なMongoDBでも、DBMS機能とドライバーに数十MBが追加されます。高速で簡単な配布を目的とした1MB未満の小さなアプリケーションには理想的ではありません。)ああ、@ Shaharyar、ACIDコンプライアンスが必要な場合はお願いします最初にデータベースを確認してください。たとえば、Mongo はそれを提供していません。データが失われるとは言いませんが、保証はありません。

もう 1 つのオプション - DBMS
を使用せずにスループットを向上 最後の提案として、少しコードが必要です (具体的には、バッファーとして機能するオブジェクト)。
1. データ セットが
小さい (100 ではなく 10 である)
2. フィールドの数が固定されている
3. ACID 準拠の要件がない
4. トランザクション負荷の増加が懸念される (つまり、1 秒あたりの更新数

が多い)また、変更をデータストア オブジェクトにキャッシュし、プログラムの終了時にフラッシュするか、「n」秒/分などごとに時間を指定してフラッシュすることもできます。

@Ian T. Small の投稿によると、.Net フレームワークに組み込まれたネイティブ XML クラスのシリアル化を使用します。

以下は単純化しすぎた疑似コードですが、アイデアが得られるはずです。

public class FieldContainer
{
    bool ChangeMade
    Timer timer = new Timer(5minutes)


    private OnTimerTick(...)
    {
          If (ChangeMade)
             UpdateXMLFlatFile()
    }
}
于 2013-02-06T21:42:56.837 に答える
0

どのくらい速くする必要がありますか?

txt が最速のオプションになります。ただし、パーサーを自分でプログラムする必要があります。(速度にコストがかかります)

xmlSerializer (または他のクラス) を使用するのは大変なので、おそらく xml を実装するのが最も簡単です。

小さな構成ファイル (~0.5MB 以下) の場合、速度の違いはわかりません。非常に大きなファイルの場合は、txt とカスタム ファイル形式が最適です。ただし、いつでもどちらの方法も選択できます。OpenStreetMap のようなプロジェクトを見てください。それらには巨大な xml ファイル (> 10 GB) があり、それでも使用可能です。

于 2013-02-06T20:23:20.443 に答える