「マップ」とはどういう意味ですか?


10

私はさまざまなCS教育資料でこの用語に何度も遭遇しました。

  1. L2 CS162(UCバークレー):

    メモリマップI / O

  2. L4 CS162(UCバークレー):

    メモリマップファイル

  3. L24 CS61(UCバークレー):

    「メモリマップI / O」:CPUアドレス空間にマップされたデバイス制御/データレジスタ

  4. 「マッピング」をグーグルで行った後でも、記事Map_(higher-order_function)を入手しましたが、 あまりわかりませんでした。
  5. さらに、ウィキペディアの記事をbitmap読んで、コンテキストの意味を理解しようとしました:

    ビット配列は、あるドメイン(ほとんどの場合、整数の範囲)からセット{0、1}の値へのマッピングです

    わかりませんが、上記のコンテキストでは、データ変換について聞こえます。

  6. CSブックを読んだ後、この段落だけが見つかりましたが、「マッピング」の意味がわかりませんでした。

    メモリマッピングLinuxは(他の形式のUnixと共に)、仮想メモリ領域の内容をディスク上のオブジェクトに関連付けることにより、メモリマッピングと呼ばれるプロセスを初期化します。

  7. 検索結果としてMapReduceも取得しました。ここで、mapは「単純な操作がシーケンスのすべての要素に適用される可能性がある並列計算のイディオム」と説明されています。

私はまだこの用語について混乱しています。私が言及したコンテキストで「マップ」が何を意味するのかを誰かが説明できますか?

回答:


14

したがって、「マップ」という言葉には2つの明確な使用法があります。ここでは、これについて説明します。

  1. 1つ目は非常に一般的で、特に関数によって、マップが「関連付ける」ことを意味します。「各をマップする」と言う場合、と言っています。X 2 X X f x = 2 xfバツ2バツバツfバツ=2バツ

    この使用法には、「メモリマップIO:」が含まれます。メモリの各部分を特定のIOアクションに関連付ける(概念的な)関数があります。実際には誰も関数を記述していませんが、実際にそこにあります。マップされたメモリの各部分には、それに関連付けられたIOがあります。おそらくディスクの一部、周辺機器のハードウェアレジスタなどです。

    同様に、ビット配列(および一般的な配列)はこれに該当します。各インデックスには(常に)関連付けられた単一の要素があるため、配列は事実上有限領域関数のエンコードです。

  2. 関数型プログラミングと派生物(MapReduceなど)では、マップは構造全体に変換を適用することを指します。

    オリジナルmapはLispからのもので、別の関数とリストを取得する関数を参照し、そのリストの各要素に関数を適用した結果を返しました。

    しかし、この現象は非常に一般的です。Haskellでは、このような操作を許可するデータ構造はファンクターと呼ばれ、操作はfmapと呼ばれます(歴史的な理由から、リストマップとの競合を避けるため)。

    これらはすべて、「マップ」操作を認める構造の抽象化であるカテゴリー理論からのファンクターの概念を通じて関連しています。


4
Functorリンク名の
Mat

非常に明確で優れた説明。しかし、「有限関数」の意味がわかりませんでした。
Kais

1
@Kaisの「有限関数」は、要素が無限大にマッピングされていない関数に最もよく使用されます。jmiteは、配列は基本的に(有効な)インデックスのセットを含まれている値にマッピングする関数であることを強調したいと思います。
Michael Hoff

2
2つの使用法は、実際には同じものの単なる側面です。このmap関数は、各要素が入力の対応する要素に関連付けられている結果を返します。違いは、最初の使用法は既存の関係を記述し、2番目の使用法は関係を作成する操作を参照することです。
Barmar

1
タイプミス
Barmar

8

以下では、いくつかの点で正確ではありませんが、基本的な理解を提供するために技術的な正確さを犠牲にしています。多くの技術ソースを読んだことは明らかであり、資料の非常に技術的な問題により、かなり基本的で単純な概念が何であるかを理解することが困難になっています。

簡単に言えば、ワードマップの最も一般的な使用法は、2つの異なるセットの事物間の関係を記述することです。これは、数学関数の場合もあれば、他の種類の表現やメカニズムの場合もあります。すぐに思い浮かぶ最も一般的なのは、ストリートマップです。

ストリートマップは、現実世界の特定の地形またはエリアの写真であり、マップに書かれた線と描画、および単語は、実際の実際の道路と建物に対応しています。道路地図に描かれている地形の表現と実際の地形との間には1対1の関係があります。

さらに見ると、道路地図が実際の地形を表していることがわかります。実際の地形には、道路地図には描かれていないオブジェクトと詳細、および動的プロセスがあります。ストリートマップは実際の地形の抽象的な表現であり、ストリートマップに描かれているのは、実際の地形にナビゲーション支援を提供するために、その目的を果たすために必要なものだけです。

問題の多くの例には、サポートメカニズムを使用して表現を作成することが含まれます。これにより、人は表現を使用でき、メカニズムは、人のアクションを、表現のファサードによって隠されている基本機能に必要なものに変換します。

メモリマップファイルI / Oを使用すると、プログラマはファイルをメモリの大きな領域と見なして、実際のファイルのメモリ表現を使用できます。プログラマーはファイルをファイルとは見なさず、代わりにそれをメモリーの大きな領域と見なします。メモリマップされたファイルI / O機能は、プログラマーが特定のメモリオフセットを参照するときに、ファイル内の対応するデータにアクセスするように注意を払っています。

メモリマップデバイスI / Oを使用すると、メモリアドレスへの書き込みまたはメモリアドレスからの読み取りにより、デバイスプログラミングインターフェイスを簡素化できます。これらの書き込みおよび読み取りアクションは、基になるメモリマップデバイスI / O機能によって、要求されたサービスまたはアクションを実行するために必要な実際のデバイス固有のアクションに変換されます。

ビットマップは、他のセットの値と1対1で対応するビットのセットです。たとえばCreateFile()、Win32 APIの関数には、さまざまな種類のファイル属性を示すために使用されるいくつかのビットマップ引数があります。ビットマップの特定のビットは、「読み取り専用で開く」や「常に新しい空のファイルを作成する」などの特定のファイル動作に対応しています。実際の引数を指定するためにバイナリビット演算を使用して結合される特別な定数が提供されます。読み取りまたは書き込み用にファイルを開くのCreateFile関数とサンプルソースコードを参照してください。


素晴らしい説明。しかし、に関して、Memory mapped file I/Oそれは標準ファイルI / O(fopen、fgetc ..)の代替ですか?RAMの性質によるパフォーマンス上の利点は、ディスクと比較して高速なアクセスですか?
Kais

1
@KaisメモリマップファイルI / O(MMF)は、標準のファイルAPI呼び出しを使用する代わりの方法です。MMFの使用には、パフォーマンス上の利点がある場合とない場合があります。これは、MMFの仕組みがファイルの内容の使用方法にどの程度適合するか、およびファイルのサイズに実際に依存します。MMF I / Oは、ファイルの領域を大きなブロックでメモリにページングします。ファイルAPIでも同様のことができ、パフォーマンスに大きな違いが生まれます。標準ファイルAPI I / Oでは、多くの場合、MMFでバイパスされるカーネルスペースからユーザースペースへのメモリバッファー間のコピーが大量に行われます。
Richard Chambers

1
@Kaisはあなたが何を求めているのかわからない。あるメモリロケーションから別のメモリロケーションにデータをコピーすると、時間とCPUサイクルがかかるため、データのコピーを減らすと、データにアクセスするときのパフォーマンスが向上します。ファイルI / Oは汎用で、内部的にファイルコンテンツの独自のキャッシュとページングを行いますが、通常、メモリバッファーのサイズは、メモリマップドファイルI / Oで使用されるサイズよりも小さくなります。ファイルAPIは、大きなブロックではなく小さめのチャンクのI / Oを優先する傾向があります。順次アクセスは、ファイルI / Oスタックとカーネル内を先読みする傾向があります。
Richard Chambers

1
@Kaisしたがって、ファイルI / O APIにヒントを提供できる場合、ファイルI / Oがパフォーマンスのボトルネックであるときに、ファイルI / O APIを使用しているアプリケーションのパフォーマンスを向上させることができます。また、メモリマップファイルI / Oを使用すると、特に、ほとんどのシーケンシャルアクセスおよび単一のMMFページサイズ内の操作で役立つ場合もあります。GNU Cgnu.org/software/libc/manual/html_node/…を使用した低レベルI / OについてのこのURLの資料とリンクを参照してください。これには、GNU低レベルのメカニズムのいくつかが記載されています。
Richard Chambers

1
@Kais setbuf()大きなファイルI / Oバッファーを設定する関数を使用することにより、C標準ライブラリファイルAPIのパフォーマンスが大幅に向上しました。ストレージデバイスへのアクセスを減らすためにできることはすべて、ボーナスになる傾向があります。ディスクドライブの場合、シークの数を減らすと大きな違いが生じる可能性がありますが、ディスクプラッターでのデータの編成方法、プラッターの回転速度、ヘッドの移動速度、キャッシングなど、多くのことを行うことはできません。データ、キャッシュヒットが電子機械式ディスクへの移動をどの程度減らすかなど
Richard Chambers

1

マッピングは、あるデータユニットを別のデータユニットに関連付けるプロセスです。マッピングの目的は、マッピングされたデータへの簡単なアクセスを可能にすることです。たとえば、従来のIBM互換システムでは、メモリアドレス0xB8000がビデオカードのビデオメモリにマップされていました。このメモリに書き込むと画面の内容が更新され、そこから読み取ると画面の内容が取得されます。ファイルマッピング、デバイスマッピング、さらにはデータ構造マッピング(通常、マップ、HashMap、またはディクショナリと呼ばれます)は、データのある単位を別のデータの単位に関連付けるすべての方法です。

マッピングには2つの主要な利点があります。1つ目は、マッピングにより、関連するデバイスまたはファイルへのアクセスの複雑さが軽減されることです。たとえば、ファイルマッピングとデバイスマッピングを使用すると、それらのデバイスを単なるメモリであるかのように扱うことができます。さまざまなI / Oポートやデータコマンドなどを学習する代わりに、RAMへの書き込みと同じくらい自然で明白な1つのシンプルなインターフェイスが得られます。

2番目の利点は、メモリ要件を削減できることです。たとえば、a Map<Integer, SomeDataType>は「スパース配列」を生成できます。これは、無効/未使用のデータをほとんど含み、ほぼ線形の時間でアクセスできる配列が必要な場合に役立ちます。これは、リンクされたリスト(n番目の要素にアクセスするためにO(n)の時間がかかる)よりもはるかに効率的です。

マッピングは主に、開発者から複雑なアルゴリズム/関数を隠すための抽象化として使用され、プログラムの実装タスクに集中できるようにします。マッピングは、処理時間の点では、デバイスまたはファイルに直接アクセスするよりも効率的であるとは限りませんが、常にそうするよりは複雑ではないことに注意してください(たとえば、マッピングは、データにアクセスするために開発者が書き込む必要がある特殊コードの量を削減します)。


説明ありがとう。ただし、「スパース配列」の意味と、それがどのように効率的かを理解できませんでした。
Kais 2018年

@Kaisスパース配列は、ほとんどゼロの値で構成されるリストです。スパース配列は、すべての値をメモリに格納する代わりに、ゼロ以外の値のみをメモリに格納します。これを行うことで、単にすべてのメモリを一度に割り当てるよりも効率的です。スパース配列は、スペースを節約するために、通常約75%の空にする必要があります。仮想メモリは多くの場合、この方法でも機能します。OSは「ダーティ」なメモリページだけを保存し、ファイルシステムはゼロ以外の値のセクターのみを保存できるようにします。
phyrfox 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.