次のような非常にまばらなデータを格納する DataTable があります。
P1 P2 P3 P4 P5 ...
J1 1 1
J2 1 1
J3 1
.
.
.
行数と列数が 10^8 を超える場合があります。
このデータをより効率的な方法で保存するにはどうすればよいですか?
次のような非常にまばらなデータを格納する DataTable があります。
P1 P2 P3 P4 P5 ...
J1 1 1
J2 1 1
J3 1
.
.
.
行数と列数が 10^8 を超える場合があります。
このデータをより効率的な方法で保存するにはどうすればよいですか?
ディスク ファイル システムがスパース ファイルをサポートしている場合は、空のファイルを作成し、スパースとしてマークしてから、サイズを に変更できrows * colums * datasize
ます。
次に、[row][column] でデータにアクセスする問題です。オフセットは次のように計算できます。
offset = ((columns.length * (row-1)) + column) * datasize
スパース ファイルには、通常 16 ~ 64kb のページが割り当てられる割り当てに関してもオーバーヘッドがありますが、データ クラスターの方法によっては、非常にうまく機能する場合があります。
予備行列を効率的に格納することについては、多くの先行技術があります。
一般的なアプローチは「リストのリスト」として知られています。たとえば、Python には、予備行列を「行ベースの連結リスト疎行列」として格納するメモリ効率の良い方法があります。
まず、これらのデータ数の DataTable を取り除きます。ここでのメモリ使用量は膨大です。
データが常に 0/1 の場合、最も効率的な方法はビット マスクです。
データが 0/1 だけでない場合は、すべての列を抽象化する構造を作成します。
これは、そのデータ構造の概念的なプロトタイプです。
class MyData {
public MyData(int[] columns, object[] data) {
_columns = columns;
_data = data;
}
int[] _columns;
object[] _data;
public object this[int column] {
get {
int index = IndexOf(column);
return index != -1 ? _data[index] : null;
}
}
private int IndexOf(int column) {
for (int i = 0; i < _columns.Length; i++)
if (_columns[i] == column)
return i;
return -1;
}
}
flyweight パターンを適用することで、_columns のメモリをさらに節約できます。
お役に立てれば