Ошибка TokenizationError при загрузке набора данных h5py в качестве кадра данных daskPython

Программы на Python
Ответить
Anonymous
 Ошибка TokenizationError при загрузке набора данных h5py в качестве кадра данных dask

Сообщение Anonymous »

Моя цель — обработать ( Pipeline) — большой файл HDF, который не помещается в оперативную память.
Основные данные представляют собой нерегулярные многомерные временные ряды (очень длинный двумерный массив). Его можно было бы разделить по столбцам, чтобы уместиться в памяти, но моему конвейеру sklearn требуется 2D DataFrame.
Говорят, что Dask способен обрабатывать данные на диске, но он даже не загружает данные для меня, что приводит к ошибке хеширования.
Минимальный воспроизводимый пример:

Код: Выделить всё

# Python v3.13.9, dask 2025.10.0, h5py 3.15.1
import h5py
import numpy as np
import pandas as pd
import dask.array as da
import dask.dataframe as dd

# stores random data as 'test' dataset via h5py
with h5py.File("test.h5", 'w') as f:
arr = np.random.rand(10, 10)
f.create_dataset(name='test', data=arr, dtype=np.float32)

# tries loading the data via h5py
with h5py.File("test.h5", 'r') as f:
loaded_arr = f['test']
# creates an array (WORKS)
dask_array = da.from_array(loaded_arr)
dask_array[3, 7].compute()
print("OK", type(dask_array))

# creates pandas dataframe (WORKS)
pandas_dataframe = pd.DataFrame(loaded_arr)
pandas_dataframe.iloc[3, 7]
print("OK", type(pandas_dataframe))

# creates dask dataframe (FAILS)
dask_dataframe = dd.from_array(loaded_arr)
dask_dataframe.iloc[3, 7].compute()
print("OK", type(dask_dataframe))
Это всегда приводит к ошибке хеширования в последнем разделе (

Код: Выделить всё

dd.from_array
):

Код: Выделить всё

TokenizationError: Object \ cannot be deterministically hashed. This likely indicates that the object cannot be serialized deterministically.
Говорят, что from_array принимает все, что поддерживает индексацию, подобное массиву:

Использует синтаксис getitem для извлечения фрагментов из массива. Массив не обязательно должен быть массивом NumPy, но должен поддерживать синтаксис срезов.

Код: Выделить всё

h5py.Dataset
определенно поддерживает это, так что я не знаю, в чем дело.
Существует также способ чтения HDF5 напрямую (Dask использует PyTables под капотом), но он также не работает из-за тонких различий между реализациями форматов PyTables и h5py, что и ожидалось.

Код: Выделить всё

dd.read_hdf("test.h5",key="test")

Код: Выделить всё

TypeError: An error occurred while calling the read_hdf method registered to the pandas backend.
Original Message: cannot create a storer if the object is not existing nor a value are passed
Я не могу загрузить все в память, даже будучи посредником (

Код: Выделить всё

dd.from_array(loaded_arr\[...\])
или dd.from_pandas(pd.DataFrame(loaded_arr))), хотя в принципе это работает.
Я ни за что не буду использовать серверную часть PyTables для создания файлов вместо h5py, даже если это поможет.
Я также не очень хочу использовать Dask, но его единственная альтернатива, Vaex, все еще не поддерживает Python 3,13 (в 2025 г.). Так что я застрял.
Я также не хочу самостоятельно реализовывать обработку фрагментированных данных. Самый простой вариант — разделить данные по столбцам, но это нарушает следующие этапы обработки.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -dataframe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»