第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么返回np.memmap時(shí)并發(fā).futures保留在內(nèi)存中?

為什么返回np.memmap時(shí)并發(fā).futures保留在內(nèi)存中?

躍然一笑 2021-05-15 16:13:23
問題我的應(yīng)用程序正在提取內(nèi)存中的zip文件列表,并將數(shù)據(jù)寫入臨時(shí)文件。然后,我將數(shù)據(jù)映射到臨時(shí)文件中,以供其他功能使用。當(dāng)我在單個(gè)過程中執(zhí)行此操作時(shí),它可以正常工作,讀取數(shù)據(jù)不會(huì)影響內(nèi)存,最大RAM約為40MB。但是,當(dāng)我使用current.futures執(zhí)行此操作時(shí),RAM高達(dá)500MB。我看了這個(gè)例子,我知道我可以以更好的方式提交作業(yè),以節(jié)省處理過程中的內(nèi)存。但是我不認(rèn)為我的問題與之相關(guān),因?yàn)槲以谔幚磉^程中并沒有耗盡內(nèi)存。我不明白的問題是,即使返回內(nèi)存映射后,為什么它仍保留在內(nèi)存中。我也不了解內(nèi)存中的內(nèi)容,因?yàn)樵趩蝹€(gè)進(jìn)程中執(zhí)行此操作不會(huì)將數(shù)據(jù)加載到內(nèi)存中。任何人都可以解釋一下內(nèi)存中的實(shí)際內(nèi)容,以及為什么單處理和并行處理之間的區(qū)別嗎?我用來memory_profiler測量內(nèi)存使用情況的PS代碼主要代碼:def main():    datadir = './testdata'    files = os.listdir('./testdata')    files = [os.path.join(datadir, f) for f in files]    datalist = download_files(files, multiprocess=False)    print(len(datalist))    time.sleep(15)    del datalist # See here that memory is freed up    time.sleep(15)其他功能:def download_files(filelist, multiprocess=False):    datalist = []    if multiprocess:        with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:            returned_future = [executor.submit(extract_file, f) for f in filelist]        for future in returned_future:            datalist.append(future.result())    else:        for f in filelist:            datalist.append(extract_file(f))    return datalistdef extract_file(input_zip):    buffer = next(iter(extract_zip(input_zip).values()))    with tempfile.NamedTemporaryFile() as temp_logfile:        temp_logfile.write(buffer)        del buffer        data = memmap(temp_logfile, dtype='float32', shape=(2000000, 4), mode='r')    return datadef extract_zip(input_zip):    with ZipFile(input_zip, 'r') as input_zip:        return {name: input_zip.read(name) for name in input_zip.namelist()}數(shù)據(jù)的輔助代碼我無法共享我的實(shí)際數(shù)據(jù),但是以下是一些簡單的代碼來創(chuàng)建演示該問題的文件:for i in range(1, 16):    outdir = './testdata'    outfile = 'file_{}.dat'.format(i)    fp = np.memmap(os.path.join(outdir, outfile), dtype='float32', mode='w+', shape=(2000000, 4))    fp[:] = np.random.rand(*fp.shape)    del fp    with ZipFile(outdir + '/' + outfile[:-4] + '.zip', mode='w', compression=ZIP_DEFLATED) as z:        z.write(outdir + '/' + outfile, outfile)
查看完整描述

1 回答

?
交互式愛情

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊

問題在于您正在嘗試np.memmap在流程之間傳遞a ,而這是行不通的。

最簡單的解決方案是改為傳遞文件名,并讓子進(jìn)程處理memmap相同的文件。


當(dāng)您通過通過參數(shù)將參數(shù)傳遞給子進(jìn)程或池方法multiprocessing,或者從一個(gè)參數(shù)返回值(包括通過間接返回ProcessPoolExecutor)時(shí),它通過調(diào)用pickle.dumps該值,在各個(gè)進(jìn)程之間傳遞泡菜來工作(細(xì)節(jié)有所不同,但是不會(huì))不管是aPipe還是aQueue或其他),然后從另一側(cè)解開結(jié)果。

Amemmap基本上只是在ped內(nèi)存中分配了一個(gè)mmap對象。ndarraymmap

而且Python不知道如何腌制mmap對象。(如果嘗試這樣做,則將得到aPicklingErrorBrokenProcessPool錯(cuò)誤,具體取決于您的Python版本。)

np.memmap 可以腌制A ,因?yàn)樗皇堑淖宇悾?code>np.ndarray但是腌制和去腌制實(shí)際上會(huì)復(fù)制數(shù)據(jù)并為您提供一個(gè)簡單的內(nèi)存數(shù)組。(如果您看的話data._mmap,它是None。)如果它給您一個(gè)錯(cuò)誤而不是靜默地復(fù)制所有數(shù)據(jù)(pickle-replacement庫dill完全是這樣:),則可能會(huì)更好TypeError: can't pickle mmap.mmap objects,但事實(shí)并非如此。


在進(jìn)程之間傳遞底層文件描述符不是不可能的-每個(gè)平臺(tái)上的細(xì)節(jié)都不同,但是所有主要平臺(tái)都可以做到這一點(diǎn)。然后,您可以使用傳遞的fdmmap在接收端構(gòu)建一個(gè),然后再構(gòu)建一個(gè)memmap。您甚至可以將其包裝到的子類中np.memmap。但是我懷疑這是否有點(diǎn)困難,有人會(huì)做到這一點(diǎn),實(shí)際上dill,如果不是numpy它本身,那可能已經(jīng)成為它的一部分。

另一種選擇是顯式使用的共享內(nèi)存功能multiprocessing,并在共享內(nèi)存而不是中分配數(shù)組mmap

但是,最簡單的解決方案是,就像我在頂部所說的那樣,只是傳遞文件名而不是對象,并讓每一側(cè)memmap使用相同的文件。不幸的是,這確實(shí)意味著您不能只使用關(guān)閉時(shí)刪除功能NamedTemporaryFile(盡管您使用它的方式已經(jīng)不可移植,并且在Windows上無法像在Unix上那樣工作),但是改變了與其他替代方案相比,這項(xiàng)工作的工作量可能仍然更少。


查看完整回答
反對 回復(fù) 2021-05-25
  • 1 回答
  • 0 關(guān)注
  • 224 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號