【发布时间】:2014-03-15 13:39:37
【问题描述】:
调用read.table()函数(在CSV文件上),如下:
download.file(url, destfile = file, mode = "w")
conn <- gzcon(bzfile(file, open = "r"))
try(fileData <- read.table(conn, sep = ",", row.names = NULL), silent = FALSE)
产生以下错误:
Error in pushBack(c(lines, lines), file) :
can only push back on text-mode connections
我试图通过tConn <- textConnection(readLines(conn)) 显式“包装”连接[然后,当然,将tConn 而不是conn 传递给read.table()],但它导致代码执行速度极慢,最终导致挂起或R进程(必须重新启动 R)。
更新(这再次表明尝试向其他人解释你的问题是多么有用!):
在我写这篇文章时,我决定回到文档并再次阅读 gzcon(),我认为它不仅解压缩了 bzip2 文件,而且将其“标记”为文本。但后来我意识到这是一个荒谬的假设,因为我知道它是 bzip2 存档中的文本 (CSV) 文件,但 R 不是。因此,我最初尝试使用textConnection() 是正确的方法,但有些东西会产生问题。如果 - 这是一个很大的 IF - 在此之前我的逻辑是正确的,那么下一个问题是问题是由 textConnection() 还是 readLines() 引起的。
请指教。谢谢!
附:我尝试读取的 CSV 文件是“几乎”CSV 格式,因此我不能使用标准 R 函数进行 CSV 处理。
===
更新 1(程序输出):
===
trying URL 'http://flossdata.syr.edu/data/fc/2013/2013-Dec/fcProjectAuthors2013-Dec.txt.bz2'
Content type 'application/x-bzip2' length 514960 bytes (502 Kb)
opened URL
==================================================
downloaded 502 Kb
trying URL 'http://flossdata.syr.edu/data/fc/2013/2013-Dec/fcProjectDependencies2013-Dec.txt.bz2'
Content type 'application/x-bzip2' length 133295 bytes (130 Kb)
opened URL
==================================================
downloaded 130 Kb
trying URL 'http://flossdata.syr.edu/data/fc/2013/2013-Dec/fcProjectDescriptions2013-Dec.txt.bz2'
Content type 'application/x-bzip2' length 5404286 bytes (5.2 Mb)
opened URL
==================================================
downloaded 5.2 Mb
===
更新 2(程序输出):
===
很长一段时间后,我收到以下消息,然后程序继续处理其余文件:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 1 did not have 8 elements
然后情况重复:在处理几个较小(小于 1MB)的文件后,程序“冻结”处理较大的(>1MB)文件:
trying URL 'http://flossdata.syr.edu/data/fc/2013/2013-Dec/fcProjectTags2013-Dec.txt.bz2'
Content type 'application/x-bzip2' length 1226391 bytes (1.2 Mb)
opened URL
==================================================
downloaded 1.2 Mb
===
更新 3(程序输出):
===
在给程序更多时间运行后,我发现了以下内容:
*) 我认为文件大小 ~1MB 在奇怪行为中起作用的假设是错误的。这是基于程序成功处理大小 > 1MB 的文件并且无法处理大小
trying URL 'http://flossdata.syr.edu/data/fsf/2012/2012-Nov/fsfProjectInfo2012-Nov.txt.bz2'
Content type 'application/x-bzip2' length 826288 bytes (806 Kb)
opened URL
==================================================
downloaded 806 Kb
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 1 did not have 4 elements
In addition: Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
EOF within quoted string
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
EOF within quoted string
处理非常小的文件时出错的示例:
trying URL 'http://flossdata.syr.edu/data/fsf/2012/2012-Nov/fsfProjectRequirements2012-Nov.txt.bz2'
Content type 'application/x-bzip2' length 3092 bytes
opened URL
==================================================
downloaded 3092 bytes
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 2 did not have 2 elements
从上面的例子可以看出,大小不是因素,而是文件结构。
*) 我错误地报告了最大文件大小,压缩后为 54.2MB。这是文件,它的处理不仅会生成错误消息并继续,而且实际上会触发不可恢复的错误并停止(退出):
trying URL 'http://flossdata.syr.edu/data/gc/2012/2012-Nov/gcProjectInfo2012-Nov.txt.bz2'
Content type 'application/x-bzip2' length 56793796 bytes (54.2 Mb)
opened URL
=================================================
downloaded 54.2 Mb
Error in textConnection(readLines(conn)) :
cannot allocate memory for text connection
*) 紧急退出后,5 个 R 进程各使用 51% 的内存,而在手动 R 重启后,这个数字仍然是 7%(数据来自 htop 报告)。
即使考虑到“非常糟糕”的文本/CSV 格式的可能性(由“扫描()消息中的错误”建议),标准 R 函数 textConnection() 和/或 readLines() 的行为在我看来很奇怪,甚至“可疑”。我的理解是,好的函数应该优雅地处理错误的输入数据,允许非常有限的时间/重试,然后如果可能的话继续处理,或者在无法进一步处理时退出。在这种情况下,我们看到(通过缺陷单屏幕截图)R 进程正在占用虚拟机的内存和处理器。
【问题讨论】:
-
文件有多大?如果没有错误并且速度很慢,您可能会看到正常行为。这个faq 可能是相关的。
-
@Roland:感谢您的参考。我怀疑这是否正常,尤其是当缓慢转变为悬挂时。我需要处理的最大 bzip2 文件大小为 5.9MB。由于它包含一个文本文件,因此对应的未压缩文件的大小约为 6.2MB。处理发生在最小的 AWS 实例 (t1.micro) 上。据亚马逊称,t1.micro 的内存大小为 0.615GB。
-
忘了提一下:代码处理前两个文件很好(意思是,相对较快),但随后挂在第三个文件上。我将使用程序输出更新我的问题。
-
澄清:当我说“很长时间”时,我的意思是超过30分钟。我创建了一个软件缺陷描述,对应这个问题,主要是为了附上我的服务器(AWS 实例)上
htop输出的截图:github.com/abnova/diss-floss/issues/1 -
决定重新阅读
gzcon()上的文档,我想我可能已经发现了所有“奇怪”行为的原因:“压缩输出将包含嵌入的 NUL 字节,因此 con 是"当然,我也可能是错的,这不是问题的根源。有没有cmets?
标签: r performance csv connection bzip2