データ (コンピュータ)

コンピューティングでは、データ（）は、1つ以上のシンボル（記号）の任意の並びである。データム（）は、単一の記号からなるデータである。データが情報と呼ばれるには解釈を要する。デジタルデータとは、アナログ表現ではなく、1（いち）と0（ぜろ）の二進法を使って表わされるデータである。現代（1960年以降）のコンピュータシステムでは、すべてのデータはデジタルである。 

データは、、、の3つの状態で存在する。コンピュータ内でデータは、たいてい並列データとして移動する。コンピュータとの間で行き来するデータは、たいてい直列データとして移動する。温度センサーなどのアナログ機器から送られたデータは、アナログ-デジタル変換器でデジタルに変換される。コンピュータが操作する量、文字、または記号を表すデータは、、、電子的、または機械的な記録媒体に保存および記録され、デジタル電気信号または光信号として伝送される。データは、周辺機器を経由してコンピュータに入出力される。

物理的なコンピュータメモリの要素は、データストレージのアドレスとバイト/ワードで構成される。デジタルデータはテーブル、あるいはSQLデータベースのようなリレーショナルデータベースに格納されることが多く、一般的に、抽象的なキーと値の組として表すことができる。データは、配列、グラフ、オブジェクトなど、さまざまな種類のデータ構造で整理することができる。そしてデータ構造には、数値、文字列、別のデータ構造など、さまざまな種類のデータを格納することができる。

 特徴 
メタデータは、データに関するデータであり、データに意味を与えて情報へ変換するのに役立つ。メタデータは、暗黙的であったり、指定されたり、または付与される場合がある。 

物理的な事象や過程に関連するデータには、時間的な要素が含まれる。この時間的な要素は、暗に含まれることもある。その例は、温度ロガー（自動記録器）などの機器が温度センサーからデータを受信するときである。温度を受信すると、そのデータは「今」という時間的な基準を持つと想定される。そのため、機器は日付、時刻、温度を一緒にして記録する。データロガーが温度を通信する場合、温度の測定値ごとにメタデータとして日付と時刻も報告する必要がある。

基本的に、コンピュータはデータの形で与えられた一連の命令に従って機能する。与えられたタスク（1つか複数）を実行するための一連の命令はプログラムと呼ばれる。プログラムは、コンピュータやその他の機械の動作を制御するためのコード化された命令の形をしたデータである。コンピュータによって実行されるプログラムは、名目的には機械語コードで構成される。プログラムによって操作されるが、中央処理装置（CPU）によって実際には実行されない記憶装置上の要素もデータである。最も本質的なところは、1つのデータム（datum）は特定の場所に格納された値ということにある。したがって、コンピュータプログラムがそのプログラムのデータを操作することによって、他のコンピュータプログラムを操作することが可能となる。

データバイトをファイルに格納するためには、ファイル形式で直列化する必要がある。一般にプログラムは、他のデータ用とは異なる特別なファイルタイプで保存される。実行可能ファイルにはプログラムが含まれ、それ以外のファイルはすべてデータファイルである。ただし、実行可能ファイルは、プログラムで使用するデータを含む場合もある（プログラムに組み込まれる）。一部の実行可能ファイルはを持ち、名目上は定数や変数の初期値が含まれているが、どれもデータと見なすことができる。

プログラムとデータの境界線が曖昧（あいまい）になることがある。たとえば、インタープリタはプログラムである。インタープリタへの入力データはそれ自体がプログラムあり、ただ本来の機械語で表現されていないだけである。インタープリタが解釈するプログラムは、人間が読めるテキストファイルであることが多く、テキストエディタプログラムで操作される。同様に、メタプログラミングでは、プログラムが他のプログラムをデータとして操作するものがある。コンパイラ、リンカ、デバッガ、プログラムアップデータ、ウィルススキャナなどのプログラムは、他のプログラムをデータとして使用する。

たとえば、ユーザーはまず、あるファイルからワードプロセッサプログラムをロードするようオペレーティングシステムに指示し、次に実行中のプログラムを使用して別のファイルに保存されている文書を開いて編集することができる。この例では、文書はデータと見なされる。ワードプロセッサがスペルチェッカも備えている場合、スペルチェッカの辞書（単語リスト）もデータと見なされる。スペルチェッカーが修正を提案するために使用するアルゴリズムは、機械語データまたは解釈可能なプログラミング言語で記述されたテキストデータのいずれかである。

別の用法として、人に対する可読性を持たないバイナリファイルを、人が読めるテキストファイルと区別して、データと呼ぶこともある。 

2007年のデジタルデータの総量は、2,810億ギガバイト（281エクサバイト）と推定されている。

 データのキーと値、構造、永続性 
データのキー（key）は、値（value）のコンテキスト（文脈）を提供する。データの構造に関係なく、常にキー要素が存在する。データおよびデータ構造におけるキーは、データ値に意味を持たせるために不可欠である。値もしくは構造内の値の集合と直接的／間接的に関連するキーがないと、その値は無意味となり、データでなくなる。つまり、データと見なされるには、値の構成要素にリンクされたキーの構成要素が必要である。

次の例のように、データはコンピュータの中でさまざまな方法で表現される。

 RAM 

 ランダムアクセスメモリ（RAM）は、CPUが直接アクセスできるデータを保持する。CPUは、プロセッサレジスタまたはメモリ内のデータのみを操作することができる。これは、CPUがストレージ機器（ディスクやテープなど）とメモリ間のデータ転送を指示する必要があるデータストレージとは対照的である。RAMは、プロセッサが読み込みまたは書き込み操作のためのアドレスを提供することにより、読み込みまたは書き込みができる、直線状の連続した場所の配列である。プロセッサは、メモリ内の任意の場所を、いつでも、任意の順序で操作することができる。RAMでは、データの最小要素は二進数ビットである。RAMにアクセスするための機能や制限はプロセッサによって異なる。一般に、メインメモリはアドレス 0（16進数の 0）から始まる位置の配列として配置される。各位置には、コンピュータ・アーキテクチャに応じて、一般に8ビットあるいは32ビットを格納することができる。

 キー 

 データキーは、メモリ上の直接的なハードウェアアドレスを指すものである必要はない。間接的、抽象的、および論理的なキーのコードを値と関連付けて格納し、データ構造を形成することができる。データ構造には、その先頭から所定の偏差（またはリンクやパス）があり、そこにデータ値が格納される。したがって、そのデータキーは、構造体へのキーと、構造体の内部での偏差（またはリンクやパス）を加えて構成される。このような構造を繰り返して、同じ繰り返し構造内にデータ値とデータキーの組を格納すると、その繰り返し構造の各要素を列に、各繰り返し構造を行に見立てた、二次元の表のような結果を得ると考えることができる。このようなデータ編成では、データキーは通常、列の値の1つ（または複数の値の複合）になる。

 編成された繰り返しデータ構造 

 繰り返しデータ構造を表形式で表現することは、多くの可能性の1つに過ぎない。繰り返しデータ構造はまた、ノード（節）が親子関係を持って互いにリンクするように、階層的に編成することもできる。これらのノードに、値やより複雑なデータ構造がリンクされる。このように、ノード階層は、ノードに関連付けられたデータ構造を扱うためのキーを提供する。この表現は、反転木（根を上に、葉を下に向けた樹形図）と考えることができる。たとえば、最近のコンピュータのオペレーティングシステムのファイルシステムが一般的な例であり、XMLもその一つの例である。

 並べ替えデータまたは順序付きデータ 

 データをあるキーでソート（整列）すると幾つかの固有の特徴を生じる。そのキーのサブセット（部分集合）の値はすべて一群として表れる。同じキーを持つデータのグループが順次通過するとき、あるいはキーのサブセットが変化するとき、これをデータ処理の世界ではブレークあるいはと呼ぶ。特に、キーのサブセット上のデータ値の集計を容易にする。

 ペリフェラルストレージ 

 フラッシュメモリのような大容量の不揮発性メモリが登場するまで、永続的なデータストレージは、磁気テープやディスクドライブのような外部ブロックデバイスにデータを書き込むことで実現されていた。これらの装置は通常、磁気メディア上のある位置に磁気ヘッドを移動し、所定のサイズのデータブロックを読み書きする。この場合、メディア上の移動位置がデータキーで、ブロックがデータ値となる。初期に用いられた「ロー・ディスク」データファイルシステムやオペレーティングシステムでは、ディスクドライブ上のをデータファイル用として確保した。このようなシステムでは、すべてのデータが書き込まれる前にファイルがいっぱいになり、データ領域が不足することがあった。そのため、各ファイルに十分な空き領域を確保するために、多くの未使用のデータ領域が非生産的に確保されていた。その後のファイルシステムでは、パーティションが導入された。それらは、ディスクのデータ領域をパーティション用に確保し、必要に応じてパーティションのブロックをファイルに動的に割り当てることで、割り当てられたブロックをより経済的に使用した。これを実現するために、ファイルシステムは、カタログまたはファイルアロケーションテーブルによって、データファイルによって使用または未使用のブロックを追跡する必要があった。これにより、ディスクのデータ領域をより有効に活用できるようになったが、ディスク全体でファイルの断片化が発生し、データを読み込むための移動時間が増えるために、パフォーマンスのオーバーヘッドが発生した。最近のファイルシステムは、断片化したファイルを動的に再編成して、ファイルアクセス時間を最適化する。ファイルシステムのさらなる発展により、ディスクドライブが仮想化され、論理ドライブを複数の物理ドライブからなるパーティションとして定義することが可能になった。

 インデックス付きデータ 

 大きなデータセットから小さなデータを取り出すことは、逐次的データ検索を伴うために非効率的な場合がある。インデックス（索引）とは、ファイル、テーブル、データセットなどのデータ構造からキーと位置アドレスを写し取り、反転木構造を使ってそれらを編成することで、元のデータのサブセットを取り出すのにかかる時間を短縮する方法である。そのためには、検索を開始する前に、取得するデータのサブセットのキーを知っていなければならない。最も一般的なインデックスは、Bツリーと動的ハッシュキーインデックス方式である。インデックス作成は、データの整理と取得のためのオーバーヘッドである。インデックスを構成する方法は他にも、キーのソートや、二分探索アルゴリズムがある。

 抽象化と間接化 

 オブジェクト指向では、データとソフトウェアを理解するために2つの基本的な概念を使用する。

 プログラムコードクラスの分類学的なランク構造（階層的なデータ構造の一例）。
 実行時に作成される、クラスライブラリからインスタンス化されたオブジェクトのメモリ内データ構造に対するデータキー参照。

インスタンス化された後に初めて、指定されたクラスの実行オブジェクトが現れる。オブジェクトのキー参照がNullになると、そのオブジェクトが参照しているデータは（データキー参照がNullになるため）データでなくなり、したがってそのオブジェクトも存在しなくなる。そのオブジェクトのデータが保存されていたメモリ位置はガベージと呼ばれ、再利用可能な未使用メモリとして分類される。

 データベース化データ 

 データベースの登場により、永続的なデータ保存のための抽象化レイヤー（層）が導入された。データベースは、データを永続化する際に、メタデータと構造化問い合わせ言語（SQL）プロトコルを用いて、クライアントとサーバーのシステム間でネットワークを介して通信し、取引の完全性を保証するために2相コミットのログシステムを使用する。

 並列分散データ処理 

 最新のスケーラブルで高性能なデータ永続化技術は、高帯域幅ネットワークに接続された多数の量産コンピュータ間にまたがる超並列分散データ処理に依存している。その一例としてApache Hadoopがあげられる。このようなシステムでは、データは複数のコンピュータに分散されるため、システム内の特定のコンピュータを直接または間接的にデータのキーで表す必要がある。これにより、異なるコンピューターで同時に処理されている2つの同じデータセットを区別することができる。