中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

電子商務(wù)公司設(shè)計(jì)網(wǎng)站建設(shè)掌門(mén)一對(duì)一輔導(dǎo)官網(wǎng)

電子商務(wù)公司設(shè)計(jì)網(wǎng)站建設(shè),掌門(mén)一對(duì)一輔導(dǎo)官網(wǎng),新版在線天堂網(wǎng),怎么對(duì)網(wǎng)站做seo優(yōu)化內(nèi)存映射模塊讀寫(xiě)文件提高IO性能mmap 1.概述 這篇文章介紹下與普通讀寫(xiě)文件不同的方式,內(nèi)存映射讀寫(xiě)文件。在什么情況下才會(huì)用到內(nèi)存映射操作文件那,還是要先了解下他。 1.1.內(nèi)存映射與IO區(qū)別 常規(guī)操作IO開(kāi)銷(xiāo) 常規(guī)的操作文件是經(jīng)過(guò)下面幾個(gè)環(huán)節(jié)操作I…

內(nèi)存映射模塊讀寫(xiě)文件提高IO性能mmap

1.概述

這篇文章介紹下與普通讀寫(xiě)文件不同的方式,內(nèi)存映射讀寫(xiě)文件。在什么情況下才會(huì)用到內(nèi)存映射操作文件那,還是要先了解下他。

1.1.內(nèi)存映射與IO區(qū)別

常規(guī)操作IO開(kāi)銷(xiāo)
常規(guī)的操作文件是經(jīng)過(guò)下面幾個(gè)環(huán)節(jié)操作IO讀寫(xiě)文件,操作過(guò)程比較復(fù)雜耗費(fèi)時(shí)間較長(zhǎng)。尤其是操作大文件時(shí)需要不斷的增加IO操作次數(shù),延遲就會(huì)增大。

  • 通過(guò)系統(tǒng)調(diào)用將控制權(quán)轉(zhuǎn)移到內(nèi)核或核心操作系統(tǒng)代碼
  • 與文件所在的物理磁盤(pán)交互
  • 將數(shù)據(jù)復(fù)制到用戶空間和內(nèi)核空間之間的不同緩沖區(qū)

內(nèi)存映射開(kāi)銷(xiāo)
避免此開(kāi)銷(xiāo)的一種方法是使用內(nèi)存映射文件。您可以將內(nèi)存映射描繪成一個(gè)過(guò)程,在該過(guò)程中,讀取和寫(xiě)入操作跳過(guò)上述許多層并將請(qǐng)求的數(shù)據(jù)直接映射到物理內(nèi)存中。因?yàn)閷?duì)于每次訪問(wèn)它不涉及單獨(dú)的系統(tǒng)調(diào)用,也不會(huì)在緩沖池之間復(fù)制數(shù)據(jù),而是內(nèi)核和用戶程序可以直接訪問(wèn)內(nèi)存。

內(nèi)存映射文件 I/O 方法為了速度而犧牲了內(nèi)存使用量,這通常稱(chēng)為時(shí)空權(quán)衡。但是,內(nèi)存映射不必使用比傳統(tǒng)方法更多的內(nèi)存。操作系統(tǒng)非常聰明。它將在請(qǐng)求時(shí)延遲加載數(shù)據(jù),類(lèi)似于 Python 生成器的工作方式。

此外,借助虛擬內(nèi)存,您可以加載大于物理內(nèi)存的文件。但是,當(dāng)沒(méi)有足夠的物理內(nèi)存用于文件時(shí),您不會(huì)看到內(nèi)存映射帶來(lái)的巨大性能改進(jìn),因?yàn)椴僮飨到y(tǒng)將使用較慢的物理存儲(chǔ)介質(zhì)(如固態(tài)磁盤(pán))來(lái)模擬它缺少的物理內(nèi)存。

2.測(cè)試數(shù)據(jù)

所有的例子都將使用文本文件 lorem.txt,在當(dāng)前目錄創(chuàng)建lorem.txt文件,并復(fù)制下面的內(nèi)容到文件。

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Donec egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo,
a elementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque vel
arcu. Vivamus purus orci, iaculis ac, suscipit sit amet, pulvinar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas
dui. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aliquam viverra fringilla
leo. Nulla feugiat augue eleifend nulla. Vivamus mauris. Vivamus sed
mauris in nibh placerat egestas. Suspendisse potenti. Mauris
massa. Ut eget velit auctor tortor blandit sollicitudin. Suspendisse
imperdiet justo.

3.內(nèi)存映射操作文件

3.1.讀取內(nèi)容

使用 mmap() 創(chuàng)建一個(gè)內(nèi)存映射文件對(duì)象,mmap是一個(gè)類(lèi),它的構(gòu)造器參數(shù)如下

  • fileno:是一個(gè)文件描述符,要么是來(lái)自 file 對(duì)象的 fileno() 方法, 要么來(lái)自 os.open()。使用者負(fù)責(zé)在調(diào)用 mmap() 之前打開(kāi)文件,并且在使用結(jié)束之后關(guān)閉它。
  • length:入 mmap() 的參數(shù)是要去映射的文件內(nèi)容的大小。如果值是 0 ,那么代表映射整個(gè)文件。如果這個(gè)值超過(guò)當(dāng)前文件,文件將會(huì)被擴(kuò)展
  • tagname=Non
  • access=None:ACCESS_READ 表示只讀,ACCESS_WRITE 表示直接寫(xiě)(對(duì)內(nèi)存的操作直接寫(xiě)入文件),或者 ACCESS_COPY 用于寫(xiě)時(shí)復(fù)制(內(nèi)存分配不寫(xiě)入文件)
  • offset=None
import mmapwith open('lorem.txt', 'r') as f:with mmap.mmap(f.fileno(), 0,access=mmap.ACCESS_READ) as m:print('First 10 bytes via read :', m.read(10))print('First 10 bytes via slice:', m[:10])print('2nd   10 bytes via read :', m.read(10))

文件指針會(huì)追蹤切片操作上次讀取的位置。這個(gè)例子中,第一次讀取之后指針向前移動(dòng)了 10 字節(jié)。在切片操作開(kāi)始之前,文件指針重置到文件開(kāi)始處,然后又向前移動(dòng)了 10 字節(jié)。切片操作之后,調(diào)用 read(10) 將會(huì)得到文件 11-20 字節(jié)的內(nèi)容。

First 10 bytes via read : b'Lorem ipsu'
First 10 bytes via slice: b'Lorem ipsu'
2nd   10 bytes via read : b'm dolor si'

3.2.寫(xiě)

為了設(shè)置一個(gè)內(nèi)存映射文件去接受更新,要以追加模式 r+ (而不是 w)打開(kāi)然后再進(jìn)行映射。然后可以使用任何更新數(shù)據(jù)的 API有兩種方式改變內(nèi)容,調(diào)用write方法和切片方式修改。

1.切片方式修改內(nèi)容

import mmap
import shutil# 復(fù)制示例文件
shutil.copyfile('lorem.txt', 'lorem_copy.txt')word = b'consectetuer'
reversed = word[::-1]
print('Looking for    :', word)
print('Replacing with :', reversed)with open('lorem_copy.txt', 'r+') as f:with mmap.mmap(f.fileno(), 0) as m:print('Before:\n{}'.format(m.readline().rstrip()))m.seek(0)  # rewindloc = m.find(word)# 通過(guò)切片方式修改文件內(nèi)容m[loc:loc + len(word)] = reversedm.flush()m.seek(0)  # rewindprint('After :\n{}'.format(m.readline().rstrip()))f.seek(0)  # rewindprint('File  :\n{}'.format(f.readline().rstrip()))

運(yùn)行結(jié)果,內(nèi)存和文件中第一行中間部分的 「consectetuer」將被替換。

Looking for    : b'consectetuer'
Replacing with : b'reutetcesnoc'
Before:
b'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'
After :
b'Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.'
File  :
Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.

2.write方法修改內(nèi)容

import mmapdef mmap_io_write(filename, text):with open(filename, mode="w", encoding="utf-8") as file_obj:with mmap.mmap(file_obj.fileno(), length=0, access=mmap.ACCESS_WRITE) as mmap_obj:mmap_obj.write(text)

3.3.復(fù)制

使用模式 ACCESS_COPY 訪問(wèn)文件,將不會(huì)將更新內(nèi)容寫(xiě)入到磁盤(pán)文件

import mmap
import shutil# 復(fù)制示例文件
shutil.copyfile('lorem.txt', 'lorem_copy.txt')word = b'consectetuer'
reversed = word[::-1]with open('lorem_copy.txt', 'r+') as f:with mmap.mmap(f.fileno(), 0,# 復(fù)制模式access=mmap.ACCESS_COPY) as m:print('Memory Before:\n{}'.format(m.readline().rstrip()))print('File Before  :\n{}\n'.format(f.readline().rstrip()))m.seek(0)  # rewindloc = m.find(word)# 修改文件內(nèi)容m[loc:loc + len(word)] = reversedm.seek(0)  # rewindprint('Memory After :\n{}'.format(m.readline().rstrip()))f.seek(0)print('File After   :\n{}'.format(f.readline().rstrip()))

這個(gè)例子中將文件句柄和 mmap 句柄分開(kāi)是必要的,with句柄是f,mmap句柄是m,因?yàn)閮蓚€(gè)對(duì)象的內(nèi)部狀態(tài)是單獨(dú)維護(hù)的。
運(yùn)行結(jié)果中access=mmap.ACCESS_COPY)復(fù)制模式只修改了內(nèi)存中的文件內(nèi)容,不會(huì)將內(nèi)容寫(xiě)入到磁盤(pán)。

Looking for    : b'consectetuer'
Replacing with : b'reutetcesnoc'
Before:
b'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'
After :
b'Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.'
File  :
Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.

3.4.正則表達(dá)式

因?yàn)橐粋€(gè)內(nèi)存映射文件擁有一個(gè)字符串的行為,因此可以使用其他操作字符串的模塊(如正則表達(dá)式)一起使用。這個(gè)例子中將會(huì)找到所有以「nulla」開(kāi)始的句子

import mmap
import repattern = re.compile(rb'(\.\W+)?([^.]?nulla[^.]*?\.)',re.DOTALL | re.IGNORECASE | re.MULTILINE)with open('lorem.txt', 'r') as f:with mmap.mmap(f.fileno(), 0,access=mmap.ACCESS_READ) as m:for match in pattern.findall(m):print(match[1].replace(b'\n', b' '))

運(yùn)行結(jié)果

b'Nulla facilisi.'
b'Nulla feugiat augue eleifend nulla.'
http://www.risenshineclean.com/news/12217.html

相關(guān)文章:

  • 站長(zhǎng)工具國(guó)產(chǎn)搜索熱度查詢
  • 金昌市建設(shè)局網(wǎng)站外鏈服務(wù)
  • 滕州手機(jī)網(wǎng)站建設(shè)案例google關(guān)鍵詞排名
  • 北京海淀區(qū)疫情最新情況解釋seo網(wǎng)站推廣
  • 革命幻燈片 wordpress365優(yōu)化大師軟件下載
  • 遵義網(wǎng)站推廣百度新聞下載安裝
  • 電子商務(wù)網(wǎng)站設(shè)計(jì)分析怎么做大量微信群推廣代發(fā)廣告
  • 濰坊做電商的網(wǎng)站建設(shè)品牌營(yíng)銷(xiāo)推廣要怎么做
  • b2b網(wǎng)站模塊重慶seo整站優(yōu)化效果
  • 廣州市建設(shè)局官方網(wǎng)站代運(yùn)營(yíng)哪家公司最靠譜
  • 高端網(wǎng)站建設(shè) 磐石網(wǎng)絡(luò)專(zhuān)注徐州seo排名公司
  • 為網(wǎng)站做seo需要什么軟件百度做推廣一般要多少錢(qián)
  • 來(lái)年做那些網(wǎng)站致富人工智能培訓(xùn)班收費(fèi)標(biāo)準(zhǔn)
  • 合肥做公司網(wǎng)站一般多少錢(qián)蘇州百度推廣排名優(yōu)化
  • 新的網(wǎng)站設(shè)計(jì)公司宜昌今日頭條新聞
  • 手機(jī)網(wǎng)站開(kāi)發(fā)書(shū)籍百度搜索引擎首頁(yè)
  • 旅游網(wǎng)站排名查詢百度推廣投訴中心
  • 做網(wǎng)站需要公司授權(quán)嘛成都最新熱門(mén)事件
  • wordpress 排版代碼seo技術(shù)優(yōu)化服務(wù)
  • 機(jī)票網(wǎng)站開(kāi)發(fā)百度網(wǎng)址大全官方網(wǎng)站
  • 俄語(yǔ)學(xué)習(xí)網(wǎng)站下載谷歌瀏覽器
  • 做企業(yè)網(wǎng)站需要買(mǎi)什么百度有幾個(gè)總部
  • 短視頻培訓(xùn)機(jī)構(gòu)seo入門(mén)到精通
  • 網(wǎng)站上文章字體部分復(fù)制怎么做seo關(guān)鍵詞排名優(yōu)化怎么樣
  • 武安市網(wǎng)站建設(shè)青島運(yùn)營(yíng)網(wǎng)絡(luò)推廣業(yè)務(wù)
  • 營(yíng)銷(xiāo)培訓(xùn)班深圳短視頻seo教程
  • 360搜索建站公司免費(fèi)發(fā)布推廣的網(wǎng)站有哪些
  • 墻蛙網(wǎng)站誰(shuí)家做的搜索引擎優(yōu)化概述
  • 網(wǎng)站懸浮廣告代碼網(wǎng)站策劃書(shū)模板范文
  • 自己做網(wǎng)站教程做銷(xiāo)售有什么技巧和方法