データの量は開発の複雑さに影響しますか。 蟻塚での会計

最近、同僚と話し合いました-データの量は開発の複雑さに影響しますか。



一番下の行は次のとおりです。





開発者にとっては、率直に言って、結論はあまりおかしくなく明確ではありませんでした。



しかし、議論はゼロからではなく、単純な計算アルゴリズムを使用した問題の議論の一部として、しかし大量のデータを使用して行われました。



この出版物の目的は、妥当な時間内に、それぞれ10億エントリの2つのリンクリストを処理する方法に関する経験を共有することです。



問題の声明



この出版物に示されているデータは、元の問題のデータと似ています。 変更は主に適用される用語に影響しました。 「蟻塚の会計」と呼びましょう。



明確にするために、プロセスは次のとおりです。
ある素晴らしい森で、彼らは動物を数えることにしました。 これを行うために、彼らはすべての動物が記録された単純な会計システムを作成しました。 システムが作成され、動物に番号が割り当てられ、その番号にはミンク、隠れ家、巣も与えられました。 要するに、すべてが簡単かつ迅速に判明しました。



彼らは蟻塚でこれについて学び、また独自の会計システムを開発することを決めました。 動物の会計システムに基づいています。



その結果、各アリは名前番号と家の住居番号を受け取りました。 各アリには、労働者、兵士などのタイプが割り当てられました...家は、蟻塚エリアに分布していました:中央、上部、下部、...



登録が完了し、アリ会議で全員が作業の完了を喜んで祝った後、主要なアリの兵士が床に着きました。 彼は(もちろん、あらゆる種類のフェロモンを広めることを言った-それは蟻にとってより理解しやすい)彼は会計が好きだ、これは必要かつ有用なことだ、そして今、彼は蟻塚のこの部分に住んでいる蟻-兵士のリストを蟻塚のすべての部分に送る必要がある このような場合には慣習的であるように、これは緊急かつ緊急に行われなければなりません。



ここで、他のアリの代表者は大騒ぎし始めました-彼らはまた、あらゆる種類のワームバグの分布と他の同様に重要なイベントのためのリストを必要としました。



そしてアリがいた-10億。





画像-ERチャート



データ構造を図に示します。





タスクは、各蟻塚地域(hill_type)に、そこに住むアリのリスト(ant_list)、特定のタイプ(ant_type)、およびその家番号(cell_list)を準備することです。



試験データ



気にする人は、テストデータを生成するためのユーティリティがあります。 このユーティリティは、C#(Visual Studio Community 2013)で記述されたコンソールプログラムとして準備されました。



ユーティリティコードはGitHubのanthill-makedata.csファイルに投稿されています 。 Visual Studioで動作するプログラムを取得するには、コンソールプロジェクトを作成し、program.csファイルをanthill-makedata.csに置き換えてプロジェクトをビルドする必要があります。 このアプローチは、コンパクトさ、可視性、流通の安全性の観点から選択されました。



デフォルトでは(パラメータなし)、ユーティリティは1000レコードごとに一連のテストデータ(CSV形式の5ファイル)を準備します。 パラメーターとして、1,000から10億までの目的のデータサイズを指定できます。



anthill-makedata.exe 1000000000



10億件のレコードでテストデータを準備するには、最大30分、約50ギガバイトのディスクスペースが必要です。 ログ(anthill-makedata.log)でランタイムを確認できます。



FARを使用してデータを表示できます。



解決策



ここで、誰が興味を持っているか、あなたは考えるかもしれません-彼らはどのようにこの問題を解決し始めるでしょうか。



開発プロセス中に、最初の呼び出しまたは2番目の呼び出しから許容可能な速度に到達できなかったため、資材では「それほど多くない」ことがわかりました。 完全なデータの処理は、非常に遅くなりました。 この理由は、小さなデータに対して迅速に実行された検索手順でしたが、データが増加するにつれて、すべてが下品になりました。



最終的に、解決策が見つかりました。 さらに、完全なデータで作業するには、それほど強力ではないコンピューターのフードの下でさえ十分でした:CPU-コア5i、RAM-12Gb(8、4を追加)、HDD-最も簡単(5400 rev)。



ソリューションの本質は、通常のインデックス配列を使用することです。 リストごとに10億の配列が作成されます。 配列内のセル番号-オブジェクト(ant、house)の番号に対応します。 蟻の識別子タイプと蟻塚の部分のタイプは、それぞれ配列のセルに配置されます。 蟻と家の配列が満たされた後(テストデータ— anthill-ant-list.csvおよびanthill-cell-list.csvファイルから)、anthill-ant-to-cell.csv通信ファイルが「プル」され、ファイルが同時に書き込まれます( CSV)と結果。



検索に時間がかからないため、インデックスによる配列セルへのアクセスは即座に行われます。 この場合、大部分の時間はファイルの読み取りと書き込み(HDDでの作業)です。



ソリューションは、C#(Visual Studio Community 2013)で記述されたコンソールプログラムとして準備されました。



プログラムコードはGitHubのanthill-makeresult.csファイルに投稿されています 。 Visual Studioで作業プログラムを取得するには、コンソールプロジェクトを作成し、program.csファイルをanthill-makeresult.csに置き換えてプロジェクトをアセンブルする必要があります(注:プロジェクトプロパティの[ビルド]セクションで、[32ビットを優先]をオフにします)。 テストデータファイルがある同じディレクトリでプログラムを実行します。



デフォルトでは(パラメーターなし)、プログラムは兵士アリのリスト(CSVファイル)を準備します。 パラメーターとして、目的のタイプを指定できます。



anthill-makeresult.exe 4(4-コードタイプ「working」)



完全なデータに基づく結果の準備には最大30分かかります。 テストデータに基づいて、約100ギガバイトのディスク領域が必要です。



簡単な要約



考慮された問題については、データの量が開発の複雑さに大きく影響しないという主張は真実であることが判明しました。





マイナスのうち、注意することができます:




All Articles