【问题标题】:fread memory usage is much larger than the filefread 内存使用量远大于文件
【发布时间】:2016-04-15 00:59:20
【问题描述】:

我在 512gb 内存服务器上。我有一个 84gig 的 CSV(我知道,很大)。我只阅读了 79 列的 31 列,其中排除的都是浮点数/小数。

在比较了许多方法之后,似乎执行我想要的最高性能的方法是 fread 文件。文件大小为 84gb,但观看“顶部”进程使用 160 gigs 的内存 (RES),即使最终 data.table 的大小约为 20gigs。

我知道 fread 会预先分配内存,这就是它如此之快的原因。只是想知道 - 这是正常的吗?有没有办法抑制内存消耗?


编辑:看起来,如果我只要求 fread 读取 10000 行(300MM),fread 仍将预分配 84 gigs 的内存。

【问题讨论】:

  • 也许fread 一次将文件片段合并到 R 中,但如果您的服务器内存足够多,我看不出问题出在哪里。如果您还没有这样做,指定 colClasses 可能会有所帮助。
  • 谢谢,我会试试 colClasses。问题只是我不想尽可能消耗服务器的共享资源。此外,不保证这些文件是令人愉快的。这是市场数据,我想在某些日子里数据量可能会爆炸。

标签: r data.table


【解决方案1】:

R FAQ 7.42。如果您想最小化您在服务器上使用的资源,请使用fread 读取一次csv,然后使用savesaveRDS 保存生成的对象。然后在需要数据时读取该二进制文件。

或者您可以使用cutawksed 等命令行工具仅选择您想要的列并将输出写入另一个文件。然后你可以在那个较小的文件上使用fread

【讨论】:

  • loadreadRDS 加载data.table 后,用户应该调用alloc.col,因为它会默默地丢失它预先分配的列。
【解决方案2】:

【讨论】:

  • 谢谢,但它没有。市场数据的问题是有很多字符串标识符。我想 SQL 导入将是正确的方法。
  • @APK 如果您可以生成 SQL 插入脚本,那么您可以使用 awk fread 它。它记录在data.table#878
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 2012-09-11
  • 2012-02-26
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2019-11-09
  • 2018-02-19
相关资源
最近更新 更多