在Mathematica中向后阅读文件 - 如何?

时间:2013-02-13 14:59:42

标签: wolfram-mathematica

我有一个包含n个“记录”的大文件(用Mathematica编写),这些记录中的每一个都是固定长度为m的列表,其中n> 10,000和500 < m&lt; 600(字节)。注意,我的系统没有能力将所有记录保存在内存中 - 将它们写入文件的原因。我有一个应用程序(在Mathematica中)需要以相反的顺序处理这些记录;即写出的最后一条记录是要处理的第一条记录。如何以相反的顺序从文件中读取这些记录?

同时(经过Mathematica I / O的一些试验和错误)后,我找到了一个解决方案。请注意,这是一个可能解决方案的精简示例。

    fname = "testfile";

    strm = OpenWrite[fname];
    n = 10; (* In general, n could be very large *)
    For[k = 1, k <= n, k++,
      (* Create list on each pass through this loop ... *)

      POt = {{k, k + 1}, {k + 2, k + 3}};
      Print[POt];

      (* Save to a file *)
      Write[strm, POt];
    ];
    Close[strm];

    (* 2nd pass to get byte offsets of each record written to file *)
    strm = OpenRead[fname];
    ByteIndx = {0};
    For[i = 1, i <= n, i++,
      PIn = Read[strm];
      AppendTo[ByteIndx, StreamPosition[strm]];
    ];
    Drop[ByteIndx, -1]

    (* Read records in reverse order *)
    For[i = n, i >= 1, i--,
      SetStreamPosition[strm, ByteIndx[[i]]];
      PIn = Read[strm];
      Print[PIn];

      (* Process PIn ... *)

    ];
    Close[strm];

如果第二遍(获得字节偏移)可以被消除但是我还没有找到如何做到这一点会很好...而且,这些字节偏移可以写入文件(类似于如果仍然存在内存问题,则一次一个地回读记录。

1 个答案:

答案 0 :(得分:0)

为了给出答案,你的第二遍可以简明扼要地写出来:

strm = OpenRead[fname];
ByteIndx=Reap[While[Sow[StreamPosition[strm]]; !TrueQ[Read[strm ] == EndOfFile]]][[2,1,;;-2]]
n=Length[ByteIndx]