本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在python中从单个文本文件写入多个xlsx文件的最快方法

发布于2021-11-24 20:22     阅读(420)     评论(0)     点赞(26)     收藏(2)



我必须定期将正在运行的日志/文本文件(300K+ 行,20MB+)转换为许多不同的 xlsx 文件(大约 2K+ 不同长度的文件)。同时,我正在根据文件中的数据创建目录树。

这个想法是创建一个可以根据需要经常重新运行的脚本。读取整个文件以获取我需要的所有信息只需要 6-7 秒,但目前第一次生成所有 xlsx 文件大约需要 2 分钟。我对 python 的了解只有几周,所以我不确定这是否合理。

由于其工作表保护功能,我正在使用 openpyxl(在 Windows 7 上),但我不确定是否有更快的过程可以做同样的事情。任何替换过程都需要具有工作表保护和列宽调整功能。

我试过“write_only”模式,但我没有注意到速度上的明显差异。去除细胞保护似乎也没有影响。

with open(file_name, "r") as f:
    close_prev_file = False
    # Turn off additional regex lookups until needed (speeds up read process)
    read_body = False
    data = f.readlines()
    for line in data:
        # Header handling
        if re.search(<large regex pattern>,line,re.IGNORECASE) is not None:
            # Activate dormant regex lookups below (slows down read process)
            read_body = True
            # If header information is found, finish writing any previous files and start a new one
            if close_prev_file is True:
                path = <pattern from concatenated variable results>
                new_file = path + <variable results> + ".xlsx"
                # If the new_file doesn't already exist, create it
                if os.path.exists(new_file) is False:
                    distutils.dir_util.mkpath(path)
                    print("Generating Excel file: " + new_file)
                    wb.save(new_file)
            close_prev_file = True
            wb = Workbook()
            ws = wb.get_sheet_by_name("Sheet")
            <apply sheet protection>
        # Body text handling
        elif read_body is True:
            # Read current line, decide how to format the output
            < if/then code>
                # Format xample: pull data from the line, split into two columns
                #ws.cell(row=row, column=1, value=re.sub("<pattern>","",line,0,re.IGNORECASE))
                #ws.cell(row=row, column=2, value=re.search("<pattern>","",line,0,re.IGNORECASE).group(0))
            <build variables from regex searches of subsequent lines>
            # If the intended file already exists, skip further regex searches and resume looking for header info
            if <all variables established>:
                path = <pattern from concatenated variable results>
                new_file = path + <variable results> + ".xlsx"
                if os.path.exists(new_file) is True:
                    <turn off reading, reset variables>
                    close_prev_file = False
                    read_body = False

解决方案


您可以尝试卸载在线程上写入 xlsx 文件的 IO 操作。由于 GIL ( https://wiki.python.org/moin/GlobalInterpreterLock ),Pythons 线程模块不会并行执行操作

然而,当在不同线程中交错 IO 和非 IO 操作时,性能可以提高。

在这里,我生成了 100 个随机 numpy 数组,并使用 np.savetxt 将它们保存到磁盘。通过卸载线程上的 IO 可以获得显着的性能。

%%time
count = 0
while count < 100:

    array = np.random.randint(1, size=(200, 600))

    np.savetxt(str(uuid.uuid1(count)), array)

    count += 1

CPU 时间:用户 5.24 秒,系统:307 毫秒,总计:5.55 秒

挂壁时间:28.9 秒

%%time
thread_list = []
count = 0
while count < 100:

    if threading.active_count() > 8:
        continue

    array = np.random.randint(1, size=(200, 600))

    thread = threading.Thread(target=np.savetxt,
                              args=[str(uuid.uuid1(count)), array])

    thread_list.append(thread)
    thread.start()

    count += 1

for thread in thread_list:
    thread.join()

CPU 时间:用户 18 秒,系统:660 毫秒,总计:18.6 秒

挂墙时间:18.5 秒

您可以尝试在单独的线程上卸载对 wb.save(new_file) 的调用。也许是这样的:

import threading
if threading.active_count() > 8: # Choose a number suitable for your pc.
    [thread.join() for thread in thread_list]

else:
    thread = threading.Thread(target=wb.save,
                              args=[new_file])

    thread_list.append(thread)
    thread.start()

因为你需要在主循环之外的某个地方定义“thread_list = []”等。在退出之前加入剩余的线程。

编辑:不要忘记导入线程库:)







所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1089586/e2e882d0cc4bcb113c41/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)