【发布时间】: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。祝你好运;)