R 是否能够在不将整个文件放入 RAM 的情况下计算大文件的列联表?
Is R able to compute contingency tables on big file without putting the whole file in RAM?
让我解释一下这个问题:
我知道函数 table
或 xtabs
计算列联表,但他们需要 data.frame,它总是存储在 RAM 中。尝试在大文件(比如 20 GB,这是我必须处理的最大值)上执行此操作时真的很痛苦。
另一方面,SAS 完全可以做到这一点,因为它逐行读取文件,并在此过程中更新结果。因此RAM中永远只有一行,这是更容易接受的。
我有时会用临时 Python 程序做与 SAS 相同的事情,当我不得不做更复杂的事情时,我要么不知道如何在 SAS 中做,要么认为它太难了麻烦。 Python 语法和集成功能(字典,正则表达式...)弥补了它的弱点(主要是速度,但是当读取 20 GB 时,速度无论如何都受到硬盘驱动器的限制)。
我的问题,然后:我想知道在 R 中是否有包可以做到这一点。我知道可以像我一样逐行读取文件在 Python 中,但是在一个大文件上计算简单的统计数据(例如列联表)是一项非常基本的任务,我觉得应该有一些或多或少的 "integrated" 功能来在统计包中完成它。
请告诉我这个问题是否应该在 "Cross Validated" 上提出。我有一个疑问,因为它更多的是关于软件而不是统计数据。
您可以为此使用包 ff
,它使用硬盘驱动器而不是 RAM,但它的实现方式不会使其(明显)比 R 使用的正常方式慢内存。
如果来自包裹描述:
The ff package provides data structures that are stored on disk but behave (almost) as if they were in RAM by transparently mapping only a section (pagesize) in main memory.
我认为这将解决您在 RAM 中加载 20GB 文件的问题。我自己已经将它用于此类目的并且效果很好。
这里还有一个小例子。来自 xtabs
文档中的示例:
基础 R
#example from ?xtabs
d.ergo <- data.frame(Type = paste0("T", rep(1:4, 9*4)),
Subj = gl(9, 4, 36*4))
> print(xtabs(~ Type + Subj, data = d.ergo)) # 4 replicates each
Subj
Type 1 2 3 4 5 6 7 8 9
T1 4 4 4 4 4 4 4 4 4
T2 4 4 4 4 4 4 4 4 4
T3 4 4 4 4 4 4 4 4 4
T4 4 4 4 4 4 4 4 4 4
ff 包
#convert to ff
d.ergoff <- as.ffdf(d.ergo)
> print(xtabs(~ Type + Subj, data = d.ergoff)) # 4 replicates each
Subj
Type 1 2 3 4 5 6 7 8 9
T1 4 4 4 4 4 4 4 4 4
T2 4 4 4 4 4 4 4 4 4
T3 4 4 4 4 4 4 4 4 4
T4 4 4 4 4 4 4 4 4 4
您可以查看 here 以获取有关内存操作的更多信息。
让我解释一下这个问题:
我知道函数 table
或 xtabs
计算列联表,但他们需要 data.frame,它总是存储在 RAM 中。尝试在大文件(比如 20 GB,这是我必须处理的最大值)上执行此操作时真的很痛苦。
另一方面,SAS 完全可以做到这一点,因为它逐行读取文件,并在此过程中更新结果。因此RAM中永远只有一行,这是更容易接受的。
我有时会用临时 Python 程序做与 SAS 相同的事情,当我不得不做更复杂的事情时,我要么不知道如何在 SAS 中做,要么认为它太难了麻烦。 Python 语法和集成功能(字典,正则表达式...)弥补了它的弱点(主要是速度,但是当读取 20 GB 时,速度无论如何都受到硬盘驱动器的限制)。
我的问题,然后:我想知道在 R 中是否有包可以做到这一点。我知道可以像我一样逐行读取文件在 Python 中,但是在一个大文件上计算简单的统计数据(例如列联表)是一项非常基本的任务,我觉得应该有一些或多或少的 "integrated" 功能来在统计包中完成它。
请告诉我这个问题是否应该在 "Cross Validated" 上提出。我有一个疑问,因为它更多的是关于软件而不是统计数据。
您可以为此使用包 ff
,它使用硬盘驱动器而不是 RAM,但它的实现方式不会使其(明显)比 R 使用的正常方式慢内存。
如果来自包裹描述:
The ff package provides data structures that are stored on disk but behave (almost) as if they were in RAM by transparently mapping only a section (pagesize) in main memory.
我认为这将解决您在 RAM 中加载 20GB 文件的问题。我自己已经将它用于此类目的并且效果很好。
这里还有一个小例子。来自 xtabs
文档中的示例:
基础 R
#example from ?xtabs
d.ergo <- data.frame(Type = paste0("T", rep(1:4, 9*4)),
Subj = gl(9, 4, 36*4))
> print(xtabs(~ Type + Subj, data = d.ergo)) # 4 replicates each
Subj
Type 1 2 3 4 5 6 7 8 9
T1 4 4 4 4 4 4 4 4 4
T2 4 4 4 4 4 4 4 4 4
T3 4 4 4 4 4 4 4 4 4
T4 4 4 4 4 4 4 4 4 4
ff 包
#convert to ff
d.ergoff <- as.ffdf(d.ergo)
> print(xtabs(~ Type + Subj, data = d.ergoff)) # 4 replicates each
Subj
Type 1 2 3 4 5 6 7 8 9
T1 4 4 4 4 4 4 4 4 4
T2 4 4 4 4 4 4 4 4 4
T3 4 4 4 4 4 4 4 4 4
T4 4 4 4 4 4 4 4 4 4
您可以查看 here 以获取有关内存操作的更多信息。