首先,我已经在堆栈和google上搜索了,发现了这样的帖子: Quickly reading very large tables as dataframes。尽管这些内容很有帮助且得到了很好的回答,但我正在寻找更多信息。
我正在寻找读取/导入最大50-60GB的“大”数据的最佳方法。
我目前正在使用case required(keys: [String])
中的fread()
函数,该函数是目前我所知道的最快的函数。我正在工作的PC /服务器具有良好的cpu(工作站)和32 GB的RAM,但仍然超过10GB的数据(有时甚至是数十亿的观测值)需要花费大量时间才能读取。
我们已经有sql数据库,但是由于某些原因,我们必须在R中处理大数据。
像这样的大文件时,有没有比data.table
更快的R或更好的选择的方法?
谢谢。
答案 0 :(得分:2)
我认为fread()
在50 GB数据集上不能很好地工作。如果有的话,您可以使用select = columns
仅加载相关的列,而不会饱和您的内存。例如:
dt <- fread("./file.csv", select = c("column1", "column2", "column3"))
我用read.delim()
读取了一个2 GB的文件,fread()
无法完全加载。因此,您可以将数据转换为.txt并使用read.delim()
。
但是,为什么不打开与要从中提取数据的SQL Server的连接。您可以使用library(odbc)
打开与SQL Server的连接,并像平常一样编写查询。您可以通过这种方式优化内存使用。
检出this short introduction至odbc
。
答案 1 :(得分:1)
假设您希望文件完全读入R,使用数据库或选择列/行的子集不会有多大帮助。
在这种情况下有帮助的是:
-确保您使用的是最新版本的data.table
-确保设置了最佳线程数
使用setDTthreads(0L)
使用所有可用线程,默认情况下data.table
使用50%的可用线程。
-检查fread(..., verbose=TRUE)
的输出,并可以在此处将其添加到您的问题中
-将文件快速磁盘或RAM磁盘放入其中,然后从中读取
如果您的数据有很多不同的字符变量,由于填充R的内部全局字符高速缓存是单线程的,则解析可能会很快,但是创建字符向量将可能会加快您的速度瓶颈。