日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python mmap对象

發(fā)布時間:2025/3/21 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python mmap对象 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

----使用內(nèi)存映射的原因

為了隨機訪問文件的內(nèi)容,使用mmap將文件映射到內(nèi)存中是一個高效和優(yōu)雅的方法。例如,無需打開一個文件并執(zhí)行大量的seek(),read(),write()調(diào)用,只需要簡單的映射文件并使用切片操作訪問數(shù)據(jù)即可。

內(nèi)存映射一個文件并不會導(dǎo)致這個文件被讀取到內(nèi)存中。也就是說,文件并沒有被復(fù)制到內(nèi)存緩存或數(shù)組中。相反,操作系統(tǒng)僅僅為文件內(nèi)容保留了一段虛擬內(nèi)存。當(dāng)訪問文件的不同區(qū)域時,這些區(qū)域的內(nèi)容才根據(jù)需要被讀取并映射到內(nèi)存區(qū)域中。而那些從沒被訪問到的部分還是留在磁盤上。所有這些過程都是透明的,在幕后完成。

如果多個python解釋器內(nèi)存映射同一個文件,得到的mmap對象能夠被用來在解釋器直接交換數(shù)據(jù)。也就是說,所有解釋器都能同時讀寫數(shù)據(jù),并且其中一個結(jié)婚iqsuozuo的修改會自動呈現(xiàn)在其他解釋器中。很明顯,這里需要考慮同步的問題。但是這種方法有時候可以用來在關(guān)島或套接字間傳遞數(shù)據(jù)。

?

----mmap是什么

mmap是一種虛擬內(nèi)存映射文件的方法,它可以將一個文件或者其它對象映射到進程的地址空間,實現(xiàn)文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對應(yīng)關(guān)系。

?

?

mmap 模塊提供“內(nèi)存映射的文件對象”,mmap 對象可以用在使用 plain string 的地方,mmap 對象和 plain string 的區(qū)別是:

  • mmap 對象不提供字符串對象的方法;
  • mmap 對象是可變的,而 str 對象是不可變的
  • mmap 對象同時對應(yīng)于打開的文件,多態(tài)于一個Python file 對象

  mmap 對象可以切片和索引,也可以為它的切片或索引賦值(因為 mmap 對象是可變的),為 mmap 對象的切片賦值時,賦值語句右值的長度必須和左值切片的長度相同。mmap 對象可以作為進程間通過文件進行 IPC 的一種替換手段。

?

----創(chuàng)建 mmap 對象

mmap(filedesc, length, tagname='') #windows mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix

  創(chuàng)建并返回一個 mmap 對象,參數(shù) filedesc 通常是由 f.fileno()獲得的,這在Python文件系列中已經(jīng)介紹過。

  mmap 創(chuàng)建對象的含義是:將指定 fd 的前 length 字節(jié)映射到內(nèi)存。

  Windows中,可以通過參數(shù)tagname為一段內(nèi)存映射指定名稱,這樣一個文件上面可以同時具有多個 mmap。windows中的內(nèi)存映射都是可讀可寫的,同時在進程之間共享。

  Unix平臺上,參數(shù)?flags?的可選值包括:

    mmap.MAP_PRIVATE:這段內(nèi)存映射只有本進程可用;

    mmap.MAP_SHARED:將內(nèi)存映射和其他進程共享,所有映射了同一文件的進程,都能夠看到其中一個所做的更改;

  參數(shù) prot 對應(yīng)的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含義是同時可讀可寫。

?

----mmap 對象的方法

?m.close()?  關(guān)閉 m 對應(yīng)的文件;

?m.find(str, start=0)?  從 start 下標(biāo)開始,在 m 中從左往右尋找子串 str 最早出現(xiàn)的下標(biāo);

?m.flush([offset, n])?  把 m 中從offset開始的n個字節(jié)刷到對應(yīng)的文件中,參數(shù) offset 要么同時指定,要么同時不指定;

?m.move(dstoff, srcoff, n)?  等于 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把從 srcoff 開始的 n 個字節(jié)復(fù)制到從 dstoff 開始的n個字節(jié),可能會覆蓋重疊的部分。

?m.read(n)?  返回一個字符串,從 m 對應(yīng)的文件中最多讀取 n 個字節(jié),將會把 m 對應(yīng)文件的位置指針向后移動;

?m.read_byte()?  返回一個1字節(jié)長的字符串,從 m 對應(yīng)的文件中讀1個字節(jié),要是已經(jīng)到了EOF還調(diào)用 read_byte(),則拋出異常 ValueError;

?m.readline()?  返回一個字符串,從 m 對應(yīng)文件的當(dāng)前位置到下一個'\n',當(dāng)調(diào)用 readline() 時文件位于 EOF,則返回空字符串;

?m.resize(n)?  把 m 的長度改為 n,m 的長度和 m 對應(yīng)文件的長度是獨立的;

?m.seek(pos, how=0)?  同 file 對象的 seek 操作,改變 m 對應(yīng)的文件的當(dāng)前位置;

?m.size() ? 返回 m 對應(yīng)文件的長度(不是 m 對象的長度len(m));

?m.tell()?  返回 m 對應(yīng)文件的當(dāng)前位置;

?m.write(str)?  把 str 寫到 m 對應(yīng)文件的當(dāng)前位置,如果從 m 對應(yīng)文件的當(dāng)前位置到 m 結(jié)尾剩余的空間不足len(str),則拋出?ValueError;

?m.write_byte(byte)?  把1個字節(jié)(對應(yīng)一個字符)寫到?m 對應(yīng)文件的當(dāng)前位置,實際上 m.write_byte(ch) 等于 m.write(ch)。如果?m 對應(yīng)文件的當(dāng)前位置在 m 的結(jié)尾,也就是?m 對應(yīng)文件的當(dāng)前位置到 m 結(jié)尾剩余的空間不足1個字節(jié),write() 拋出異常ValueError,而 write_byte() 什么都不做。

?

?

參考:

https://www.cnblogs.com/Security-Darren/p/4733387.html

https://docs.python.org/2/library/mmap.html

轉(zhuǎn)載于:https://www.cnblogs.com/baxianhua/p/10212766.html

總結(jié)

以上是生活随笔為你收集整理的python mmap对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。