【问题标题】:Read, Transpose Big Matrix and Save读取、转置大矩阵并保存
【发布时间】:2015-03-29 23:41:58
【问题描述】:

您有一个非常大的矩阵保存在 csv 文件中。您想转置它并将其保存到另一个文件中。您不能一次将所有数据加载到内存中。你是怎么做到的?

我认为我们可以从文件中读取一行并将其转换为一列并将该列写入文件。读取行并将其转置到列对我来说是可以的,但我不知道如何逐列写入文件。任何人都可以实现?

【问题讨论】:

  • 一种选择是按列读取原始文件,但这可能需要一段时间,具体取决于 csv 的大小,因为您必须读取每一行 x 次,其中 x 是数字它有的列。我确信有更好的解决方案,有人可能会很好地透露。
  • 还是把它加载到内存中。操作系统在管理虚拟内存方面将比您想出的任何试图保持在物理 RAM 限制内的方案做得更好。
  • 目标语言是什么?这里有 python 和 C++。这是一个更普遍的问题吗?你对性能感兴趣吗?例如,转置一个非常大的矩阵会导致 很多 缓存未命中和较长的执行时间。
  • @deeiip 面试官?这是堆栈溢出,而不是代码高尔夫......如果我们谈论的是人为的谜题,这是错误的网站。这是“专业人士如何解决这个问题”网站,而不是“帮助我找到工作并为我完成工作”网站。
  • @J...面试题在这个网站上很常见,不信可以去搜一下。

标签: python c++ file file-io transpose


【解决方案1】:

无论如何,我会给你一个提示:

ol = or x C + oc (consider arr[or][oc])

它将被移动到转置矩阵中的新位置 nl,例如 nl = A[nr][nc],或者在 C/C++ 术语中

nl = nr x R + nc(R - 列数,C 是矩阵转置时的行数) nr = oc 和 nc = or,所以将它们替换为 nl,

nl = oc x R + or 所以,

ol     = or x C     + oc
ol x R = or x C x R + oc x R
       = or x N     + oc x R    (from the fact R * C = N)
       = or x N     + (nl - or) --- from [eq 1]
       = or x (N-1) + nl

或,

nl = ol x R - or x (N-1)

nl 和 ol 的值永远不会超过 N-1,所以考虑两边的模除以 (N-1),我们根据同余的性质得到以下内容,

nl mod (N-1) = (ol x R - or x (N-1)) mod (N-1)
             = (ol x R) mod (N-1) - or x (N-1) mod(N-1)
             = ol x R mod (N-1), since second term evaluates to zero
nl = (ol x R) mod (N-1), since nl is always less than N-1

所以现在您可以一次只读取一个元素并将其放在相应转置矩阵中的正确位置。

【讨论】:

  • 得说我不明白你是如何真正避免在内存中构造转置矩阵的。也许如果你可以使用更“正统”的符号,真的很难看到发生了什么。
【解决方案2】:

来自https://github.com/micans/reaper 的“转置”程序可能在这里有所帮助。它将矩阵作为单个字符串加载到内存中,然后将转置结果写入文件而不在内存中创建它。因此,内存开销绝对限于磁盘上矩​​阵的大小(未压缩)。该程序可以读取/写入压缩数据,并且行和单元格分隔符是可定制的(默认'\n'和'\t')。在对 60460 x 4671 矩阵(压缩大小为 125M)进行的简单测试中,它使用的内存比 Python + pandas 少约 20 倍,比 R 少约 12 倍,在这两种情况下都快约 13 倍。好处是不会发生数据舍入或截断,每个字段都被复制为字节序列。

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-07-28
    • 2018-08-12
    • 2013-11-16
    相关资源
    最近更新 更多