小编Jam*_*mes的帖子

追加多个大数据.表; 使用colClasses和fread进行自定义数据强制; 命名管道

[这是一篇文章中的多个错误报告/功能请求,但它们并不一定是孤立的.事先向怪物发帖道歉.根据help(data.table)的建议在此处发布.另外,我是R的新手; 如果我没有遵循下面代码中的最佳实践,那么道歉.我尝试着.]

1. rbindlist崩溃6*8GB文件(我有128GB RAM)

首先,我想报告使用rbindlist追加大数据.表导致R到segfault(ubuntu 13.10,打包的R版本3.0.1-3ubuntu1,从CRAN中从R安装的data.table).机器有128 GiB的RAM; 所以,鉴于数据的大小,我不应该耗尽内存.

我的代码:

append.tables <- function(files) {
    moves.by.year <- lapply(files, fread)
    move <- rbindlist(moves.by.year)
    rm(moves.by.year)
    move[,week_end := as.Date(as.character(week_end), format="%Y%m%d")]
    return(move)
}
Run Code Online (Sandbox Code Playgroud)

崩溃消息:

 append.tables crashes with this:
> system.time(move <- append.tables(files))
 *** caught segfault ***
address 0x7f8e88dc1d10, cause 'memory not mapped'

Traceback:
 1: rbindlist(moves.by.year)
 2: append.tables(files)
 3: system.time(move <- append.tables(files))
Run Code Online (Sandbox Code Playgroud)

有6个文件,每个大约8 GiB或1亿行长,8个变量,标签分隔.

2.可以fread接受多个文件名吗?

在任何情况下,我认为这里更好的方法是允许fread将文件作为文件名的向量:

files <- c("my", "files", "to be", "appended")
dt <- fread(files)
Run Code Online (Sandbox Code Playgroud)

据推测,你可以在引擎盖下更加节省内存,而不必像R的用户那样同时保留所有这些对象.

3. colClasses给出错误信息

我的第二个问题是我需要为我的一种数据类型指定一个自定义强制处理程序,但是失败了: …

r append fread data.table

8
推荐指数
1
解决办法
6365
查看次数

data.table:在使用键变量的单调变换时绕过setkey

'sorted'属性是官方data.table API的一部分吗?

我经常做一些事情,比如从日期变量中获取一周/月/季度/年变量,这当然是单调变换.然后,我通过使用这些单调派生变量之一来做事.

我想知道用星期/月/等的名称直接替换我的日期变量是否安全.排序属性中的变量并使事情正常工作?即以下是安全的:

library(data.table)
library(lubridate)
DT <- data.table(day=as.Date(c('2006-01-30', '2006-01-31', '2006-02-01', '2006-02-02')),
                 d=1:4, key='day')
DT[, month := floor_date(day, unit='month')]
# is this safe?
attr(DT, 'sorted') <- 'month'
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚是否有一些其他基础数据结构引用到表中可能会导致此技术出现问题.

r data.table

8
推荐指数
1
解决办法
92
查看次数

为什么rbindlist不尊重列名?

我刚发现这个bug,却发现有些人称之为"功能".这让rbindlist不喜欢do.call("rbind",l)rbind会尊重列名.此外,文档中没有提到这种完全出乎意料的行为.这真的是故意的吗?

代码示例:

> library(data.table)
> DT1 <- data.table(a=1, b=2)
> DT2 <- data.table(b=3, a=4)
> DT1
a b
1: 1 2
> DT2
b a
1: 3 4
Run Code Online (Sandbox Code Playgroud)

我希望rbind这些会生成a = 1,4的列; b = 2,3.并获得与rbind.data.tablerbind.data.frame,虽然rbind.data.table产生警告.

> rbind(DT1, DT2)
a b
1: 1 2
2: 4 3
Warning message:
In data.table::.rbind.data.table(...) :
Argument 2 has names in a different order. Columns will be bound by name …
Run Code Online (Sandbox Code Playgroud)

r rbind data.table

7
推荐指数
1
解决办法
9318
查看次数

内存高效中心稀疏SVD/PCA(朱莉娅)?

我有一个300万x 900万的稀疏矩阵,有数十亿个非零项.R和Python不允许稀疏矩阵具有超过MAXINT非零的条目,因此我发现自己使用Julia.

虽然使用标准偏差来缩放这些数据是微不足道的,但是贬低当然是一种天真的方式,因为这会产生一个密集的200+太字节矩阵.

有关svd的相关代码是julia,访问https://github.com/JuliaLang/julia/blob/343b7f56fcc84b20cd1a9566fd548130bb883505/base/linalg/arnoldi.jl#L398

从我的阅读来看,这段代码的一个关键元素是AtA_or_AAt结构和围绕这些结构的几个函数,特别是A_mul_B!.为方便起见,下面复制

struct AtA_or_AAt{T,S} <: AbstractArray{T, 2}
    A::S
    buffer::Vector{T}
end

function AtA_or_AAt(A::AbstractMatrix{T}) where T
    Tnew = typeof(zero(T)/sqrt(one(T)))
    Anew = convert(AbstractMatrix{Tnew}, A)
    AtA_or_AAt{Tnew,typeof(Anew)}(Anew, Vector{Tnew}(max(size(A)...)))
end

function A_mul_B!(y::StridedVector{T}, A::AtA_or_AAt{T}, x::StridedVector{T}) where T
    if size(A.A, 1) >= size(A.A, 2)
        A_mul_B!(A.buffer, A.A, x)
        return Ac_mul_B!(y, A.A, A.buffer)
    else
        Ac_mul_B!(A.buffer, A.A, x)
        return A_mul_B!(y, A.A, A.buffer)
    end
end
size(A::AtA_or_AAt) = ntuple(i -> min(size(A.A)...), Val(2))
ishermitian(s::AtA_or_AAt) = true
Run Code Online (Sandbox Code Playgroud)

这被传递到eigs函数中,在那里发生了一些魔术,然后输出被处理到SVD的相关组件.

我认为使这个"快速居中"类型设置工作的最佳方法是使用AtA_or_AAT_centered版本的子类AtA_or_AAT,或多或少模仿行为,但也存储列方式,并重新定义A_mul_B!功能恰当.

但是,我并没有非常使用朱莉娅,并且已经遇到了一些难以修改的问题.在我再次尝试深入研究之前,我想知道如果这被认为是一个合适的攻击计划,或者如果在这么大的矩阵上进行SVD​​的简单方法,我是否能得到反馈(我没有看到它,但我可能错过了一些东西).

编辑:我没有修改基础Julia,而是尝试编写一个"中心稀疏矩阵"包来保持输入稀疏矩阵的稀疏结构,但是在各种计算中适当地进入列.它的实施范围有限,而且有效.不幸的是,它仍然太慢,尽管为了优化事物做了一些非常广泛的努力.

sparse-matrix svd pca julia

6
推荐指数
1
解决办法
316
查看次数

Ubuntu 18.04真彩屏坏了

screen 是我自己编译的少数软件之一。我发现它往往比存储库中的版本更好地支持终端的一些现代功能。我这样做已经有一段时间了,没有遇到太大问题。然而,升级到 18.04 后,(真实)颜色似乎已损坏。

我运行这段代码来打印彩虹,它仍然可以在裸机中工作:

awk 'BEGIN{                                                                                                                                                                                                                                                                                                     
    s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;                                                                                                                                                                                                                                                                                  
    for (colnum = 0; colnum<77; colnum++) {                                                                                                                                                                                                                                                                                  
        r = 255-(colnum*255/76);                                                                                                                                                                                                                                                                                             
        g = (colnum*510/76);                                                                                                                                                                                                                                                                                                 
        b = (colnum*255/76);
        if (g>255) g = 510-g;
        printf "\033[48;2;%d;%d;%dm", r,g,b;
        printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
        printf "%s\033[0m", substr(s,colnum+1,1);
    }
    printf "\n";
}'
Run Code Online (Sandbox Code Playgroud)

但是,当我启动屏幕时,颜色消失了。它似乎并没有回落到 256 色,而是颜色值错误。

我在重新编译屏幕之前就看到了这种行为。看到这个问题后,我重新编译,甚至破坏了我的 git 存储库,并重新克隆和重新编译,试图让事情正常工作,但无济于事。

想一想这到底是哪里出了问题?我什至不确定哪个库可能对此负责,或者它如何与 konsole 但不与 screen 一起工作。

好的颜色看起来像这样: 好颜色

不好的颜色看起来像这样: 在此输入图像描述

gnu-screen ncurses termcap terminfo

5
推荐指数
1
解决办法
922
查看次数

标签 统计

data.table ×3

r ×3

append ×1

fread ×1

gnu-screen ×1

julia ×1

ncurses ×1

pca ×1

rbind ×1

sparse-matrix ×1

svd ×1

termcap ×1

terminfo ×1