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 来完成此操作,或者有更有效/更快的方法来完成此操作,请告诉我!任何参考文献。给个例子表示赞赏!
我选择了特定的 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) 如何将具有可为空整数数据类型的 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) 当使用字典或类进行模式定义来调用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列始终按字母顺序排序,附加数据按照所需顺序排序.我错过了一些基本的东西吗?有没有办法让表列的顺序遵循类定义顺序而不是按字母顺序排列?
如何有效地表达以下内容numexpr?
z = min(x-y, 1.0) / (x+y)
Run Code Online (Sandbox Code Playgroud)
在这里,x与y具有相同的形状的一些大型NumPy的阵列.
换句话说,我想盖x-y到1.0除以之前x+y.
我想使用单个numexpr表达式来做这个(x并且y很大,我不想不止一次迭代它们).
我试图将Python线程模块与PyTables一起使用.有人能告诉我PyTabes是否是线程安全的吗?我得到一些错误,它似乎与线程有关.
谢谢,马克
我试图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文件进行排序,因为它们不是"完整"索引?
使用pandas/pytables,可以轻松返回键列表store.keys().
>>> store.keys()
['/df_coord', '/metaFrame']
Run Code Online (Sandbox Code Playgroud)
使用标准字典检查以查看密钥是否存在,if 'df_coord' in store.keys():除非/包含密钥,否则返回false .是否有另一种简单的方法来评估密钥的存在而无需连接字符串?
最终的解决方案是使用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) 我有以下熊猫数据框:
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表?