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

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

你如何優(yōu)化在 Python 中搜索大文件

你如何優(yōu)化在 Python 中搜索大文件

一只甜甜圈 2023-06-20 14:32:55
我有一個包含大約 800 萬行文件名的大文件,我正在嘗試搜索包含特定值的文件名。找到一個很好,但問題是我正在嘗試搜索大約 50k 個唯一值,而且搜索所需的時間非常長。with open('UniqueValueList.txt') as g:    uniqueValues = g.read().splitlines()outF = open("Filenames_With_Unique_Values.txt", "w")with open('Filenames_File.txt') as f:    fileLine = f.readlines()    for line in fileLine:        for value in uniqueValues:            if value in line:                outF.write(line)outF.close()我無法將 filenames 文件加載到內(nèi)存中,因?yàn)樗罅恕_€有其他方法可以優(yōu)化此搜索嗎?
查看完整描述

2 回答

?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊

我的兩個理論是 (1) 內(nèi)存映射文件并為每個值搜索使用多行正則表達(dá)式,以及 (2) 將工作分配給多個子進(jìn)程。我將兩者結(jié)合起來,得出以下結(jié)論。也許可以在父進(jìn)程中執(zhí)行 mmap 并共享,但我走的是簡單的路線,只是在每個子進(jìn)程中都這樣做,假設(shè)操作系統(tǒng)會為您找出有效的共享。


import multiprocessing as mp

import os

import mmap

import re


def _value_find_worker_init(filename):

    """Called when initializing mp.Pool to open an mmaped file in subprocesses.

    The file is `global mmap_file` so that the worker can find it.

    """

    global mmap_file

    filenames_fd = os.open(filename, os.O_RDONLY)

    mmap_file = mmap.mmap(filenames_fd, length=os.stat(filename).st_size,

        access=mmap.ACCESS_READ)


def _value_find_worker(value):

    """Return a list of matching lines in `global mmap_file`"""

    # multiline regex for findall

    regex = b"(?m)^.*?" + value + b".*?$"

    matched = re.compile(regex).findall(mmap_file)

    print(regex, matched)

    return matched


def find_unique():

    with open("UniqueValueList.txt", "rb") as g:

        uniqueValues = [line.strip() for line in g]

    with open('UniqueValueList.txt', "rb") as g:

        uniqueValues = [line.strip() for line in g]

    with mp.Pool(initializer=_value_find_worker_init,

            initargs=("Filenames_File.txt",)) as pool:

        matched_values = set()

        for matches in pool.imap_unordered(_value_find_worker, uniqueValues):

            matched_values.update(matches)

    with open("Filenames_With_Unique_Values.txt", "wb") as outfile:

        outfile.writelines(value + b"\n" for value in matched_values)


find_unique()


查看完整回答
反對 回復(fù) 2023-06-20
?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個贊

我們可以將文件對象用作迭代器。迭代器會逐行返回每一行,可以處理。這不會將整個文件讀入內(nèi)存,適合在 Python 中讀取大文件。

查看完整回答
反對 回復(fù) 2023-06-20
  • 2 回答
  • 0 關(guān)注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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