首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在使用uproot.daskframes从多个根文件创建daskframe时出现“打开的文件太多”错误

如何避免在使用uproot.daskframes从多个根文件创建daskframe时出现“打开的文件太多”错误
EN

Stack Overflow用户
提问于 2020-02-12 21:26:13
回答 2查看 343关注 0票数 1

我想尝试使用uproot将一些具有平面根NTupels的根文件读取到桌面框架中。214个文件,每个500kb,大约8000行,每个文件16列/变量。它们很容易放入内存中的熊猫数据框中,但我正在尝试学习dask (和uproot,以前只使用过root_pandas ),因为我预计未来会有更大的数据集。

因此,我认为uproot.daskframes(list_of_paths, flatten=True)应该是将文件读入桌面框架的工具。创建框架很好,但在以下Too many open files错误中计算它:https://pastebin.com/mfHgB16Q。当我将文件限制为例如100,它的计算工作,但很慢(30秒),对少数文件,它是没有问题的。当我使用100个文件并增加篮框(例如100Mb)以提高速度时,我得到一个RecursionErrorhttps://pastebin.com/xTHa1Wav

我自己的解决方案是只创建普通的pandas数据帧并将其连根拔起,延迟创建,并使用dask创建连接它们,这对我来说效果很好,并且对于大量文件,计算速度比uproot.daskframes更快。

代码语言:javascript
复制
import uproot
from dask import delayed
import dask.dataframe as dd

def daskframe_from_rootfiles(path_list, treepath, branches=None):
    @delayed
    def get_df(file, treepath=None, branches=None):
        tree = uproot.open(file)[treepath]
        return tree.pandas.df(branches=branches)

    dfs = [get_df(path, treepath, branches=branches) for path in path_list]
    daskframe = dd.from_delayed(dfs)
    return daskframe

延迟数据帧创建的好处是我可以使用dask将其并行化。

但我觉得应该有一些规范的方法,也许我遗漏了一些东西,也许我应该为daskframes函数使用其他选项,或者我应该完全使用其他函数来完成这项工作。您能在一些想法或最佳实践方面帮助我吗?

EN

回答 2

Stack Overflow用户

发布于 2020-02-16 06:23:46

代码语言:javascript
复制
    @delayed
    def get_df(file, treepath=None, branches=None):
        tree = uproot.open(file)[treepath]
        return tree.pandas.df(branches=branches)

我猜这个函数会留下一个打开的文件句柄。也许有一些方法可以在打开文件后关闭文件?

代码语言:javascript
复制
    @delayed
    def get_df(filename, treepath=None, branches=None):
        file = uproot.open(filename)
        tree = file[treepath]
        df = tree.pandas.df(branches=branches)
        file.close()  # does something like this exist?
        return df
票数 2
EN

Stack Overflow用户

发布于 2020-02-12 22:56:21

Jim Pivarski的comment证实了我的方法是可以的,这并不是我做的完全错误的事情。因为他是开发人员,所以我不期望更复杂的答案,所以我将这标记为ansered。

编辑:直到两天后我才能将我自己的答案标记为解决方案,所以我会等到那时,或者其他人发布答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60189433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档