*使用RPy(或其他方式)有效地将数据帧从Pandas移动到R

jef*_*ott 9 python r dataframe rpy2

我在Pandas中有一个数据帧,我想用R函数对它做一些统计.没问题!RPy可以轻松地将数据帧从Pandas发送到R:

import pandas as pd
df = pd.DataFrame(index=range(100000),columns=range(100))
from rpy2 import robjects as ro
ro.globalenv['df'] = df
Run Code Online (Sandbox Code Playgroud)

如果我们在IPython:

%load_ext rmagic
%R -i df
Run Code Online (Sandbox Code Playgroud)

由于某种原因,ro.globalenv路线比rmagic路线稍慢,但无论如何.重要的是:我最终将使用的数据帧是~100GB.这提出了一些问题:

  1. 即使只有1GB的数据,传输速度也相当慢.
  2. 如果我理解正确,这会在内存中创建两个数据帧副本:一个在Python中,一个在R中.这意味着我只需要将内存需求增加一倍,而且我甚至都没有运行统计测试!

有没有办法:

  1. 在Python和R之间更快地传输大型数据帧?
  2. 访问内存中的同一个对象?我怀疑这要求登月.

lga*_*ier 6

rpy2 正在使用一种转换机制,试图避免在Python和R之间移动时复制对象.但是,目前这只是在R - > Python的方向上工作.

Python有一个名为"缓冲区接口"的接口rpy2,它可以让它最小化R和Python之间兼容的C级副本的数量(参见http://rpy.sourceforge.net/rpy2/doc-2.5) /html/numpy.html#from-rpy2-to-numpy - 由于__array_struct__界面不再是主要选择,因此doc似乎过时了.

R中没有与缓冲区接口等效的东西,当前关注的是阻止我提供相同的功能,rpy2即在垃圾收集过程中处理借用的引用(并且没有足够时间仔细思考它).

总而言之,有一种方法可以在不复制的情况下在Python和R之间共享数据,但这需要在R中创建数据.