声明fread如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
Run Code Online (Sandbox Code Playgroud)
问题是:两个这样的调用的阅读性能是否存在差异fread:
char a[1000];
Run Code Online (Sandbox Code Playgroud)
fread(a, 1, 1000, stdin);fread(a, 1000, 1, stdin);它会读取1000字节一次,每次?
我有几个不同的txt文件具有相同的结构.现在我想用fread将它们读入R,然后将它们组合成一个更大的数据集.
## First put all file names into a list
library(data.table)
all.files <- list.files(path = "C:/Users",pattern = ".txt")
## Read data using fread
readdata <- function(fn){
dt_temp <- fread(fn, sep=",")
keycols <- c("ID", "date")
setkeyv(dt_temp,keycols) # Notice there's a "v" after setkey with multiple keys
return(dt_temp)
}
# then using
mylist <- lapply(all.files, readdata)
mydata <- do.call('rbind',mylist)
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但速度不理想.每个txt文件有1M个观察值和12个字段.
如果我用它fread来读取单个文件,那就快了.但是使用apply,那么速度非常慢,显然比逐个读取文件需要花费很多时间.我想知道这里出了什么问题,速度提升有什么改进吗?
我试图llply在plyr包中,有是没有太大的速度上涨.
此外,是否有任何语法data.table实现垂直连接喜欢rbind和unionin sql?
谢谢.
有人可以澄清APN(Apple推送通知)所要求的内容吗?
文档说它会在连接完成后立即开始发送.这是否意味着我不fread()对其进行操作?
这是我当前尝试阅读它的代码.我没有放入fread()循环,因为我不知道什么响应表明"没有更多的记录可读",我不想在我的服务器上进行无限循环.
<?php
$apnsCert = 'HOHRO-prod.pem';
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'verify_peer', false);
$apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);
echo 'error=' . $error;
echo 'errorString=' . $errorString;
$result = fread($apns, 38);
echo 'result=' . $result;
fclose($apns);
?>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我得到的只是一个空回复.没有错误,所以它是连接.
我不知道null回复是否意味着没有数据,或者我的方法fread()是错误的.
谢谢
我不知道如何使用colClasses选项中选择特定的列fread.我试过用NULL几种方法但没有用.这是一个最小的例子.我只想要第1列和第3列.
dt <- data.table(a=1:5,b=6:10,c=10:14)
write.csv(dt,"dt.csv",row.names=F)
dt <- fread("dt.csv",colClasses=?)
packageVersion("data.table")
[1] ‘1.8.10’
getRversion()
[1] ‘3.0.1’
Run Code Online (Sandbox Code Playgroud)
导入的数据集应如下所示:
a c
1: 1 10
2: 2 11
3: 3 12
4: 4 13
5: 5 14
Run Code Online (Sandbox Code Playgroud) 我有一个大文件(3.5G),我正在尝试导入使用data.table::fread.
它最初是从作为文本打开并保存为CSV的rpt文件创建的.
这适用于较小的文件(相同类型的数据 - 相同列和所有.这个只是更长的时间范围和更广泛的范围).
当我试着跑
mydata <- fread("mycsv.csv")
Run Code Online (Sandbox Code Playgroud)
我收到错误:
fread中的错误("mycsv.csv"):在字符串中嵌入nul:'y\0e\0a\0r\0'
这是什么意思?
我正在尝试使用fread包中的函数输入一个大的制表符分隔文件(大约2GB)data.table.但是,因为它太大了,所以它并不完全适合内存.我试图通过使用skip和nrow参数来输入它,例如:
chunk.size = 1e6
done = FALSE
chunk = 1
while(!done)
{
temp = fread("myfile.txt",skip=(chunk-1)*chunk.size,nrow=chunk.size-1)
#do something to temp
chunk = chunk + 1
if(nrow(temp)<2) done = TRUE
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我一次读取100万行,对它们进行计算,然后得到下一百万行等.这段代码的问题是在检索fread到每个块后,需要开始扫描文件从一开始就经过每次循环迭代后,skip增加了一百万.结果,在每个块之后,fread实际到达下一个块需要更长和更长时间,这使得效率非常低.
有没有办法告诉你fread暂停每一个说100万行,然后继续阅读从那一点开始而不必重新开始?任何解决方案,还是应该是新功能请求?
我正在使用R来显示一些所有数据都是.txt格式的数据.目录中有几百个文件,我想一次性将它们全部加载到一个表中.
有帮助吗?
编辑:
列出文件不是问题.但是我无法从列表转到内容.我从这里尝试了一些代码,但是我得到了这个部分的错误:
all.the.data <- lapply( all.the.files, txt , header=TRUE)
Run Code Online (Sandbox Code Playgroud)
话
Error in match.fun(FUN) : object 'txt' not found
Run Code Online (Sandbox Code Playgroud)
任何能够澄清这个问题的代码片段都将不胜感激.
例如,这是fread的参考:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Run Code Online (Sandbox Code Playgroud)
读取一个count元素数组,每个元素的大小为"size bytes"...那么有多少BITS会读取一个fread(&x, 1, 1, stream)?八个还是CHAR_BIT?
我对大型数据文件中的fread函数速度感到惊讶,data.table但它如何能够如此快速地读取?fread和之间的基本实现差异是read.csv什么?
fread ×10
r ×6
data.table ×5
c ×2
php ×2
stream ×2
byte ×1
char ×1
fgets ×1
lapply ×1
performance ×1
read.table ×1
readr ×1
smtp ×1