uproot - 如何将大量数据作为惰性数组读取
问题描述
我正在尝试读取大量数据作为lazyarrays,执行以下操作:
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 large
cachetools
是无法将一个数组放入缓存时发出的错误消息。人们经常遇到这个问题,我想我需要抓住它并用更丰富的信息重新发送它,或者甚至可能扩大缓存以使其适合。(这是一个糟糕的主意吗?我需要为缓存找到一个好的默认策略。)
请参阅最近的 GitHub 问题——惰性数组确实有一个隐式basketcache
(与cache
. basketcache
如果您的任何购物篮大于 1 MB(默认限制),您可能需要提供明确的说明。
推荐阅读
- swift - 斯威夫特未能产生表达诊断
- c# - 如何仅将选定的实体从 DB 添加到 DBContext?
- sql - 为什么我不能将 ON UPDATE 选项添加到指向同一字段的几个外键?
- python - 如何在 Discord.py 中清除特定用户的消息
- android - 单元测试以检查在使用 RxBindings 时是否调用了接受
- bash - 如何在bash中触摸包含大于特定日期的日期的文件名?
- wordpress - 如何为主题开发人员提供 WordPress RTL 支持
- swift - 快速单击其中一个 tableview 单元格内的按钮后重新加载 tableview
- r - 如何在 tidymodels 的 mlp 通用界面中更改权重?
- airflow - Airflow 和 Cloud Composer 中的最大 DAG 数量