如何读取大量数据作为惰性数组
How to read large set of data as lazyarrays
我正在尝试读取大量数据作为 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)
因此,如您所见,我们可以毫无问题地将 'hits' 数据读取为惰性数组和数组。但是,当我对不同的分支尝试相同的步骤时,我得到了一个 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
不同)。如果您的任何篮子大于 1 MB(默认限制),您可能需要提供明确的 basketcache
。
我正在尝试读取大量数据作为 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)
因此,如您所见,我们可以毫无问题地将 'hits' 数据读取为惰性数组和数组。但是,当我对不同的分支尝试相同的步骤时,我得到了一个 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
不同)。如果您的任何篮子大于 1 MB(默认限制),您可能需要提供明确的 basketcache
。