标签: pytables

以小块的形式创建非常大的 NUMPY 数组(PyTables 与 numpy.memmap)

SO 有很多问题看起来是相同的,但它们并没有真正完全回答我的问题。我认为这对于计算科学家来说是一个非常常见的用例,所以我正在创建一个新问题。

问题:

我从文件中读取了几个小的 numpy 数组(每个约 10 MB)并对它们进行一些处理。我想创建一个更大的数组 (~1 TB),其中数组中的每个维度都包含这些较小文件之一的数据。任何试图在 RAM 中创建整个较大数组(或其大部分)的方法都是不合适的,因为它会淹没 RAM 并使机器停止运行。因此,我需要能够初始化较大的数组并小批量填充它,以便每个批次都写入磁盘上的较大数组。

我最初认为 numpy.memmap 是可行的方法,但是当我发出类似的命令时

mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))
Run Code Online (Sandbox Code Playgroud)

RAM 泛滥,机器速度减慢直至停止。

经过一番探索后,PyTables 似乎很适合这类事情,但我不太确定。此外,很难在文档或其他地方找到一个简单的示例来说明这种常见的用例。

如果有人知道如何使用 PyTables 来完成此操作,或者有更有效/更快的方法来完成此操作,请告诉我!任何参考文献。给个例子表示赞赏!

python mmap numpy large-files pytables

5
推荐指数
1
解决办法
4061
查看次数

如何使用 pytables 或 h5py 将数据集对象复制到不同的 hdf5 文件?

我选择了特定的 hdf5 数据集,并希望将它们复制到新的 hdf5 文件中。我可以找到一些有关在两个文件之间复制的教程,但是如果您刚刚创建了一个新文件并且想要将数据集复制到该文件怎么办?我以为下面的方法可行,但事实并非如此。有什么简单的方法可以做到这一点吗?

>>> dic_oldDataset['old_dataset']
<HDF5 dataset "old_dataset": shape (333217,), type "|V14">

>>> new_file = h5py.File('new_file.h5', 'a')
>>> new_file.create_group('new_group')

>>> new_file['new_group']['new_dataset'] = dic_oldDataset['old_dataset']


RuntimeError: Unable to create link (interfile hard links are not allowed)
Run Code Online (Sandbox Code Playgroud)

python hdf5 pytables h5py

5
推荐指数
2
解决办法
1万
查看次数

将具有可为空整数数据类型的 pandas DataFrame 保存到 HDF 文件(format='table')

如何将具有可为空整数数据类型的 pandas DataFrame 保存到“表”格式的 HDF 文件中?

# input data
import pandas as pd, numpy as np
df = pd.DataFrame(index=list(range(2)), data={'x':[np.uint8(1)]*2}, dtype='UInt8')

df.to_hdf('temp.h5', 'data', format='table')
# raises the following exceptions:
# AttributeError: module 'tables' has no attribute 'Uint8Col'
# Exception: cannot find the correct atom type -> [dtype->UInt8,items->Index(['x'], dtype='object')] module 'tables' has no attribute 'Uint8Col'

# 'fixed' format does not work either:
df.to_hdf('temp.h5', 'data', format='fixed')
# raises the following exception:
# TypeError: objects of type ``IntegerArray`` are not supported in this …
Run Code Online (Sandbox Code Playgroud)

python pytables dataframe pandas hdf

5
推荐指数
0
解决办法
670
查看次数

有没有办法按特定顺序存储PyTable列?

当使用字典或类进行模式定义来调用createTable()时,似乎PyTable列按字母顺序排列.我需要建立一个特定的订单,然后使用numpy.genfromtxt()从文本中读取和存储我的数据.我的文本文件没有按字母顺序包含变量名称,因为它们适用于PyTable.

例如,假设文本文件名为mydata.txt,并按如下方式组织:

time(row1)bVar(row1)dVar(row1)aVar(row1)cVar(row1)

time(row2)bVar(row2)dVar(row2)aVar(row2)cVar(row2)...

time(rowN)bVar(rowN)dVar(rowN)aVar(rowN)cVar(rowN)

因此,希望创建一个使用这些列排序的表,然后使用numpy.genfromtxt命令填充表.

# Column and Table definition with desired order
class parmDev(tables.IsDescription):
    time = tables.Float64Col()
    bVar = tables.Float64Col()
    dVar = tables.Float64Col()
    aVar = tables.Float64Col()
    cVar = tables.Float64Col()

#...

mytab = tables.createTable( group, tabName, paramDev )

data = numpy.genfromtxt(mydata.txt)
mytab.append(data)
Run Code Online (Sandbox Code Playgroud)

这是期望的,因为它是简单的代码并且非常快.但是,PyTable列始终按字母顺序排序,附加数据按照所需顺序排序.我错过了一些基本的东西吗?有没有办法让表列的顺序遵循类定义顺序而不是按字母顺序排列?

pytables

4
推荐指数
1
解决办法
1037
查看次数

限制在numexpr中的子表达式

如何有效地表达以下内容numexpr

z = min(x-y, 1.0) / (x+y)
Run Code Online (Sandbox Code Playgroud)

在这里,xy具有相同的形状的一些大型NumPy的阵列.

换句话说,我想盖x-y1.0除以之前x+y.

我想使用单个numexpr表达式来做这个(x并且y很大,我不想不止一次迭代它们).

python numpy pytables numexpr

4
推荐指数
1
解决办法
433
查看次数

PyTables线程安全吗?

我试图将Python线程模块与PyTables一起使用.有人能告诉我PyTabes是否是线程安全的吗?我得到一些错误,它似乎与线程有关.

谢谢,马克

python multithreading thread-safety pytables

4
推荐指数
1
解决办法
965
查看次数

ptrepack sortby需要'完整'索引

我试图ptrepack一个用pandas HDFStore pytables接口创建的HDF文件.数据帧的主要索引是时间,但我做了一些列,data_columns以便我可以通过这些data_columns过滤磁盘上的数据.

现在我想通过其中一个列对HDF文件进行排序(因为选择对我来说太慢了,84 GB文件),使用带有如下sortby选项的ptrepack :

()[maye@luna4 .../nominal]$ ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc --sortby=clat C9.h5 C9_sorted.h5
Run Code Online (Sandbox Code Playgroud)

我收到错误信息:

()[maye @ luna4 .../nominal] $从'C9.h5:/'复制到'C9_sorted.h5:'的问题错误是 - >:字段clat必须关联一个'完整'索引桌子/df/table (Table(390557601,)) ''.目标文件如下所示:C9_sorted.h5(File)''Last modif.:'Fri Jul 26 18:17:56 2013'Object Tree:/(RootGroup)''/ df(Group)''/ df/table(表(0,),shuffle,blosc(9))''

回溯(最近一次调用最后一次):在sys.exit(main())文件"/usr/local/epd/lib/python2.7/site -packages/tables/scripts/ptrepack.py",第480行,主要升级flavors = upgradeflavors)文件"/usr/local/epd/lib/python2.7/site-packages/tables/scripts/ptrepack.py",行225,在copyChildren引发RuntimeError("请检查节点名称是不是"RuntimeError:请检查节点名称是否在目标中没有重复,如果是,请添加--overwrite-nodes标志,如果需要.特别是支付注意rootUEP并不是在欺骗你.

这是否意味着,我无法通过索引列对HDF文件进行排序,因为它们不是"完整"索引?

python pytables pandas

4
推荐指数
2
解决办法
3859
查看次数

检查密钥是否在没有路径的HDF5Store中

使用pandas/pytables,可以轻松返回键列表store.keys().

>>> store.keys()
['/df_coord', '/metaFrame']
Run Code Online (Sandbox Code Playgroud)

使用标准字典检查以查看密钥是否存在,if 'df_coord' in store.keys():除非/包含密钥,否则返回false .是否有另一种简单的方法来评估密钥的存在而无需连接字符串?

python hdf5 pytables pandas

4
推荐指数
1
解决办法
2394
查看次数

附加到HDFStore失败,"无法匹配现有的表结构"

最终的解决方案是使用read_csv的"converters"参数,并在将其添加到DataFrame之前检查每个值.最终,超过80GB的原始数据中只有2个破碎的值.

参数如下所示:

converters={'XXXXX': self.parse_xxxxx}
Run Code Online (Sandbox Code Playgroud)

像这样的小静态助手方法:

@staticmethod
def parse_xxxxx(input):
    if not isinstance(input, float):
        try:
            return float(input)
        except ValueError:
            print "Broken Value: ", input
            return float(0.0)
    else:
         return input
Run Code Online (Sandbox Code Playgroud)

在尝试阅读ca. 40GB +的csv数据到HDF文件中我遇到了一个令人困惑的问题.读取大约1GB后,整个过程失败,出现以下错误

File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 658, in append
    self._write_to_group(key, value, table=True, append=True, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 923, in write_to_group
    s.write(obj = value, append=append, complib=complib, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2985, in write **kwargs)
  File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2675, in create_axes
    raise ValueError("cannot match existing table structure for [%s] on appending data" % items)
ValueError: …
Run Code Online (Sandbox Code Playgroud)

python pytables pandas

4
推荐指数
1
解决办法
3745
查看次数

如何将Pandas DataFrame存储为HDF5 PyTables表(或CArray,EArray等)?

我有以下熊猫数据框:

import pandas as pd
df = pd.read_csv(filename.csv)
Run Code Online (Sandbox Code Playgroud)

现在,我可以HDFStore用来将df对象写入文件(例如将键值对添加到Python字典中):

store = HDFStore('store.h5')
store['df'] = df
Run Code Online (Sandbox Code Playgroud)

http://pandas.pydata.org/pandas-docs/stable/io.html

当我查看内容时,此对象是一个frame

store 
Run Code Online (Sandbox Code Playgroud)

输出

<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[552,23252])
Run Code Online (Sandbox Code Playgroud)

但是,为了使用索引,应该将其存储为table对象。

我的方法是尝试HDFStore.put(),即

HDFStore.put(key="store.h", value=df, format=Table)
Run Code Online (Sandbox Code Playgroud)

但是,此操作失败并显示以下错误:

TypeError: put() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

如何将Pandas Dataframe保存为PyTables表?

python hdf5 pytables pandas hdfstore

4
推荐指数
1
解决办法
4471
查看次数