在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.
有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.
我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:
有哪些最佳实践工作流程可用于完成以下任务:
真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.
编辑 - 我希望如何工作的示例:
我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.
编辑 - 特别回应杰夫的问题:
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).
我有关于HDF5性能和并发性的以下问题:
参考文献:
我已经使用大熊猫进行研究了大约两个月,效果很好.有了大量的中型跟踪事件数据集,pandas + PyTables(HDF5接口)在允许我使用我所熟悉和喜爱的所有Python工具处理异构数据方面做了大量工作.
一般来说,我在PyTables中使用Fixed(以前称为"Storer")格式,因为我的工作流程是一次写入,多次读取,并且我的许多数据集的大小都是这样的,我可以将50-100个数据集加载到内存中.时间没有严重的缺点.(注意:我的大部分工作都是在具有128GB +系统内存的Opteron服务器级机器上完成的.)
但是,对于大型数据集(500MB或更高),我希望能够使用PyTables"Tables"格式的更具可伸缩性的随机访问和查询功能,这样我就可以在内存之外执行查询,然后将更小的结果集加载到内存中进行处理.然而,这里的一大障碍是写性能.是的,正如我所说,我的工作流程是一次写入,多次读取,但相对时间仍然是不可接受的.
作为一个例子,我最近在我的48核心机器上运行了一个大型的Cholesky分解,花了3分8秒(188秒).这会生成~2.2 GB的跟踪文件 - 跟踪与程序并行生成,因此没有额外的"跟踪创建时间".
我的二进制跟踪文件初始转换为pandas/PyTables格式花费了相当多的时间,但很大程度上是因为二进制格式是故意无序的,以减少跟踪生成器本身的性能影响.这与从Storer格式转换为Table格式时的性能损失无关.
我的测试最初是用pandas 0.12,numpy 1.7.1,PyTables 2.4.0和numexpr 0.20.1运行的.我的48核心机器每个核心运行2.8GHz,我正在写一个ext3文件系统,它可能(但不一定)在SSD上.
我可以在7.1秒内将整个数据集写入Storer格式的HDF5文件(生成文件大小:3.3GB).写入表格式的相同数据集(结果文件大小也是3.3GB),写入需要178.7秒.
代码如下:
with Timer() as t:
store = pd.HDFStore('test_storer.h5', 'w')
store.put('events', events_dataset, table=False, append=False)
print('Fixed format write took ' + str(t.interval))
with Timer() as t:
store = pd.HDFStore('test_table.h5', 'w')
store.put('events', events_dataset, table=True, append=False)
print('Table format write took ' + str(t.interval))
Run Code Online (Sandbox Code Playgroud)
输出很简单
Fixed format write took 7.1
Table format write took 178.7
Run Code Online (Sandbox Code Playgroud)
我的数据集有28,880,943行,列是基本数据类型:
node_id int64
thread_id int64
handle_id int64
type int64
begin int64
end int64 …Run Code Online (Sandbox Code Playgroud) 当Pandas在HDFStore上工作时(例如:.mean()或.apply()),它是否将内存中的完整数据作为DataFrame加载,还是作为Serie逐个记录处理?
我必须处理大数据文件,我可以指定数据文件的输出格式.
我打算使用Pandas处理数据,我想设置最佳格式,以便最大化性能.
我已经看到panda.read_table()已经走了很长一段路,但它仍然至少需要与我们想要读取的原始文件大小一样多的内存(实际上至少是内存的两倍)才能转换为DataFrame .这可能适用于高达1 GB但高于1 GB的文件?这可能很难,特别是在在线共享机器上.
但是,我已经看到,现在Pandas似乎支持使用pytables的HDF表.
我的问题是:当我们在整个HDF表上进行操作时,Pandas如何管理内存?例如.mean()或.apply().它是首先在DataFrame中加载整个表,还是直接从HDF文件处理数据而不存储在内存中?
问题:磁盘使用情况下hdf5格式是否紧凑?我的意思是,它像xml一样冗长或更像JSON吗?(我知道有索引和东西,但我在这里对数据的简单描述感兴趣)
我想将一个带键的500GB-800GB表转储到HDF5中,然后检索与特定键匹配的行.
对于HDF5文件,像所有数据访问这样的项使用整数"行"数字,所以我似乎必须在HDF5之外实现"行号键映射".
这会有用吗?我是否需要访问内存(RAM)中的整个HDF5?
任何人都可以告诉我HDF5在这种情况下的表现有多糟糕吗?如果有合适的索引,这只是一本庞大的字典,对吧?
我应该使用其他东西吗?