“地图”是什么意思?


10

我在各种CS教育材料中已经多次遇到过这个术语:

  1. L2 CS162(加州大学伯克利分校):

    内存映射的I / O

  2. L4 CS162(加州大学伯克利分校):

    内存映射文件

  3. L24 CS61(加州大学伯克利分校):

    “内存映射的I / O”:映射到CPU地址空间的设备控制/数据寄存器

  4. 甚至在谷歌搜索“映射”之后,我得到了文章 Map_(higher-order_function),但是对我来说还不是很清楚。
  5. 更甚者,尝试bitmap通过阅读Wikipedia文章来理解上下文中的含义:

    位数组是从某个域(几乎总是整数范围)到集合{0,1}中的值的映射

    我不确定,但是在上面的上下文中,这对我来说是关于数据转换的。

  6. 后来,在阅读了CS书籍之后,我只找到了这一段,但没有为我解释“映射”的含义:

    内存映射Linux(以及其他形式的Unix)通过将虚拟内存区域与磁盘上的对象相关联来初始化虚拟内存区域的内容,此过程称为内存映射。

  7. 我还得到了MapReduce作为搜索结果:where map被解释为“并行计算中的一种习语,其中对序列的所有元素(可能是并行的)应用简单的操作”。

我对这个词仍然感到困惑。在我提到的环境中,谁能解释“地图”的含义?

Answers:


14

因此,“地图”一词有两种不同的用法,我将在这里对其进行分解。

  1. 第一个非常通用,其中map表示“关联”,尤其是通过函数的方式。如果说“ 每个映射X2 X ”,然后我们说X f x = 2 xFX2XXFX=2X

    这种用法包括“内存映射的IO:”(将每个内存与特定的IO操作相关联)的(概念性)功能。实际上没有人写出函数,但实际上确实存在:对于每个映射的内存,都有一些与之关联的IO。也许是磁盘的一部分,也许是外围设备上的硬件寄存器,等等。

    同样,位数组(通常是数组)也属于这种情况:每个索引(在任何给定时间)都具有与之关联的单个元素,因此数组实际上是有限域函数的编码。

  2. 在函数式编程和派生类(例如MapReduce)中,映射是指在整个结构上应用转换。

    原本的 map来自Lisp,在这里它引用了采用另一个函数和一个列表的函数,并返回了将该函数应用于该列表的每个元素的结果。

    但是,这种现象很普遍。在Haskell中,允许这种操作的数据结构称为functor,该操作称为fmap。(出于历史原因,为了避免与列表映射发生冲突)。

    所有这些都通过类别理论中的Functor概念进行关联,该概念是允许“ map”操作的结构的抽象。


4
Functor链接名称中的拼写错误-很少建议编辑。)
Mat Mat '18

非常清楚和出色的解释。但是我不明白“有限功能”的含义。
Kais

1
@Kais'有限函数'最常用于没有元素映射到无穷大的函数。我猜jmite想强调一下,数组基本上是将(有效)索引集映射到所包含值的函数。
Michael Hoff

2
这两种用途实际上只是同一件事的各个方面。该map函数返回结果,其中每个元素都与输入的相应元素相关联。区别在于,第一种用法描述了现有的关系,而第二种用法则是创建该关系的操作。
Barmar

1
错字:Fucntor
Barmar

8

在下文中,我将通过多种方式降低准确性,以牺牲技术准确性为基础。显然,您已经阅读了许多技术资料,并且该材料的技术性很强,这使您难以理解什么是一个非常基本和简单的概念。

简单来说,单词映射的最常见用法是描述两个不同集合中事物之间的关系。这可能是数学函数,也可能是其他某种表示形式和机制。立即想到的最常见的是街道地图。

街道地图是现实世界中特定地形或区域的图片,其中写在地图上的线条和图形以及文字与实际的实际街道和建筑物相对应。街道地图中显示的地形表示与实际地形之间存在一对一的关系。

进一步看,我们还可以看到街道地图是实际地形的代表。实际地形具有街道地图未描绘的对象和细节以及动态过程。街道地图是实际地形的抽象表示,街道地图中所描绘的只是实现其目的所需要的,为真实地形提供导航帮助。

问题中的许多示例涉及使用支持机制创建表示,以便一个人可以使用该表示,并且该机制将该人的动作转换为该表示的外观所隐藏的基础功能所需的内容。

内存映射文件I / O允许程序员将文件视为大内存区域,以使用真实文件的内存表示形式。程序员不会将文件视为文件,而是会将其视为大内存区域。内存映射文件的I / O功能要确保当程序员引用特定的内存偏移量时,才能访问文件中的相应数据。

内存映射的设备I / O允许通过写入存储器地址或从存储器地址读取来简化设备编程接口。这些写入和读取操作由基础内存映射的设备I / O功能转换为执行请求的服务或操作所需的特定于设备的实际操作。

位图是一组位,这些位提供与某些其他组的值一对一的对应关系。例如,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绕开。
理查德·钱伯斯

1
@Kais不确定您要问什么。将数据从一个存储位置复制到另一个存储位置需要花费时间和CPU周期,因此减少数据复制可以提高访问数据时的性能。文件I / O是通用的,并且在内部对其文件内容进行自己的缓存和分页,但是通常,内存缓冲区的大小小于“内存映射文件I / O”所使用的大小。文件API倾向于面向小块而不是大块的I / O。在文件I / O堆栈和内核中进行前瞻性操作往往会有利于顺序访问。
理查德·钱伯斯

1
@Kais,因此,如果您可以向文件I / O API提供提示,那么当文件I / O是性能瓶颈时,可以提高使用文件I / O API的应用程序的性能。而且,使用内存映射文件I / O还可能特别有助于在单个MMF页面大小内进行大多数顺序访问和操作。请参阅此URL上有关使用GNU C进行的低级I / O的资料和链接gnu.org/software/libc/manual/html_node/…,其中描述了一些GNU低级机制。
理查德·钱伯斯

1
@Kais通过使用该setbuf()函数来设置大文件I / O缓冲区,我已经看到C标准库文件API的显着性能改进。您可以采取任何减少访问存储设备的措施来获得好处。对于磁盘驱动器,减少搜索次数可能会产生很大的不同,但是您会做很多事情,例如磁盘上的数据组织方式,磁盘的旋转速度,磁头移动速度,数据,缓存命中率的降低如何减少对机电磁盘的访问等
理查德·钱伯斯

1

映射只是将一个数据单元与另一个数据单元关联的过程。映射的目的是允许简化对映射数据的访问。例如,在经典的IBM兼容系统中,内存地址0xB8000被映射到视频卡的视频内存。写入此存储器将更新屏幕内容,而从其中读取将检索屏幕内容。文件映射,设备映射甚至是数据结构映射(通常称为Map,HashMap或Dictionary)都是将一个数据单元与另一个数据单元关联的所有方式。

映射有两个主要好处。首先是映射降低了访问关联设备或文件的复杂性。例如,文件映射和设备映射使您可以将那些设备视为纯内存。您无需学习各种I / O端口,数据命令等,而是获得一个简单的接口,该接口与写入RAM一样自然且显而易见。

第二个好处是它可以减少内存需求。例如,a Map<Integer, SomeDataType>可以产生一个“稀疏数组”,这在您想要一个将主要包含无效/未使用的数据并且可以在接近线性的时间内访问的数组时很有用。这比链表(访问第n个元素需要O(n)时间)要高效得多。

映射主要用作对开发人员隐藏复杂的算法/功能的抽象,以便他们可以专注于实现程序的任务。请注意,就处理时间而言,映射可能并不总是像直接访问设备或文件一样高效,但总比这样做要简单(例如,映射减少了开发人员访问数据所必须编写的专用代码量) )。


感谢您的解释。但是我不明白“稀疏数组”是什么意思,以及它如何更有效。
Kais

@Kais稀疏数组是一个主要由零值组成的列表。稀疏数组不是将所有值存储在内存中,而是仅将非零值存储在内存中。这样,它比简单地一次分配所有内存更为有效。为了节省空间,稀疏阵列通常应为大约75%的空白。虚拟内存通常也以这种方式工作,其中操作系统仅存储“脏”页面的内存,以及仅允许您存储非零值扇区的文件系统。
phyrfox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.