uproot - 如何将大量数据读取为惰性数组

标签 uproot

我正在尝试将大量数据作为惰性数组读取,执行以下操作:

import uproot
import numpy as np

file_path = "~/data.root"
data = uproot.lazyarrays(file_path, "E")
hits = data['hits']
>>> <ChunkedArray [176 125 318 ... 76 85 51] at 0x7fb8612a8390>
np.array(hits)
>>> array([176, 125, 318, ...,  76,  85,  51], dtype=int32)

正如您所看到的,我们可以将“点击”数据读取为 lazzyarray 和数组,没有任何问题。但是,当我对不同的分支尝试相同的步骤时,我收到一个 ValueError 。以下是我的操作方法:

data['hits.dom_id']
>>> ValueError: value too large

但是,当我使用 uproot.array() 访问“hits.dom_id”时,我会获取数据。以下是我的操作方法:

data2 = uproot.open(file_path)['E']['Evt']['hits']
data2['hits.dom_id'].array()
>>> <JaggedArray [[806451572 806451572 806451572 ... 809544061 809544061 809544061] [806451572 806451572 806451572 ... 809524432 809526097 809544061] [806451572 806451572 806451572 ... 809544061 809544061 809544061] ... [806451572 806451572 806451572 ... 809006037 809524432 809544061] [806451572 806451572 806451572 ... 809503416 809503416 809544058] [806451572 806465101 806465101 ... 809544058 809544058 809544061]] at 0x7fb886cbbbd0>

我注意到了,但这也许只是一个巧合,每当我的数据采用 JaggesArray 格式时,uproot.lazyarrays() 都会引发相同的 ValueError。

我可能做错了什么,你能帮忙吗?

注意:我不认为这是 RAM 问题。我尝试使用大于我的数据集的缓存大小来调整缓存大小,并且 uproot.lazyarrays() 仍然引发 ValueError。

谢谢!

最佳答案

ValueError: value Too Largecachetools 在无法将一个数组放入缓存时发出的错误消息。人们经常遇到这个问题,所以我想我需要捕获它并用信息更丰富的消息重新发送它,或者甚至可能扩大缓存以使其适合。 (这是一个糟糕的主意吗?我需要找到一个好的缓存默认策略。)

请参阅最近的 GitHub 问题 - 惰性数组确实具有隐式 basketcache(与 cache 不同)。如果您的任何购物篮大于 1 MB(默认限制),您可能需要提供显式basketcache

关于uproot - 如何将大量数据读取为惰性数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924485/

相关文章:

python - 如何使用uproot加载引用值(TRefArray)

python - 在 Pandas 中检索数据

python - 写树、篮子数量和压缩(连根拔起)

python - 获取 JaggedArray 的直方图

python - 打开用于机器学习的 ROOT NTuple 的最快、最节省内存的方法是什么?

python - uproot 中的字符串数组

python - 如何高效地检索uproot中的轨道?