【问题标题】:J Language: Reading large 2D matrixJ语言:读取大型二维矩阵
【发布时间】:2015-03-06 16:42:02
【问题描述】:

我是 J 新手,正在尝试导入我的一个大型数据集以进行进一步实验。它是一个二维的双精度矩阵,大约 80000x50000。到目前为止,我已经找到了两种不同的方法来将数据加载到 J 中。

首先是将数据转换为J格式(用下划线代替负数,将指数符号数转换为J格式等)然后加载(改编自J: Handy method to enter a matrix?):

(".;._2) fread 'path/to/file'

第二种方法是使用tables/dsv

这两种方法我都遇到了同样的问题:即这些方法适用于小矩阵,但在大约 10M 值时失败。似乎输入只是被截断到某个任意限制。如何加载任意大小的矩阵?如果我必须转换为某种二进制格式,那没关系,只要在某处有格式说明即可。

我应该补充一点,这是一个 64 位系统和 J 构建,我可以成功地创建一个适当大小的随机数矩阵,所以它似乎不是对矩阵大小本身的限制,但是仅在 I/O 期间。

谢谢!

编辑:我没有找到确切的原因,但感谢 Dane,我确实找到了使用 JMF('data/jmf' 包)的解决方法。事实证明,JMF 只是没有标头的直接二进制数据,本机 (?) 或 little-endian 数据可以直接映射到 JFL map_jmf_ 'x';'whatever.bin'

【问题讨论】:

  • 内存不足了吗?你能给出一行 J 来生成与你生成的精度和一般形状相匹配的虚拟数据吗?
  • 我认为您可能会看到 REPL 中显示的正常截断。例如,尝试i.1e3 1e3,您会注意到您不会看到所有的百万条目——只有表格的顶部(或底部)部分。如果你做$ (".;._2) fread 'path/to/file',它有你期望的大小/形状吗?
  • 很高兴 JMF 解决了您的问题。我一直在研究这个问题,我认为你的措辞没有达到你的预期。 fread 应该只是将您的文件读入字符串,就像 1!:1 一样。 (".;._2) 使用字符串的最后一个字节作为分隔符,分割字符串删除分隔符的每个实例,并尽可能将每个部分转换为数字。试穿(".;._2) '1e3 5 2.345e9 ' 的尺寸。注意字符串中的最后一个空格。
  • 我现在超级好奇。你能分享你文件的前几兆字节吗?我想制定自己的导入方式。
  • 抱歉耽搁了——这里是:corygil.es/data/*/GPL13534.sample.xz。祝你好运;)

标签: matrix io j


【解决方案1】:

您的内存不足。快速测试一下整数占用了多少空间,结果如下:

   7!:2 'i. 80000 5000'
8589936256

也就是说,一个 80,000 x 5,000 的整数矩阵需要 8 GB 的内存。您的 80,000 x 50,000 矩阵(如果是整数)将需要大约 80 GB 的内存。

您的下一个问题应该是对一个太大而无法加载到内存中的矩阵执行数组或矩阵运算。

【讨论】:

  • 我刚刚注意到您说您成功创建了一个 80,000 x 50,000 的随机数数组。你用的 J 线是什么?
  • 我成功完成了m =: ?. 80000 50000 $ 4000000000,一旦完成就可以对m进行基本操作。我有 128GB 的​​ RAM(还有更多),但我的 I/O 问题始于一个小得多的输入矩阵,大约为 10000x10000。
  • 是的,我非常想使用 J 的 mmap 工具,即使是适合内存的矩阵,但我的问题是将数据转换为那种格式。我找不到任何地方以这样的方式描述 JMF 格式,以至于我可以写一些东西来将我的 TSV 转换为它。它只是原始二进制(数字)数据吗?什么字节序? (对不起,如果 OT)