3

我有一个包含 n 个“记录”的大文件(用 Mathematica 编写),每个记录都是一个固定长度 m 的列表,其中 n > 10,000 和 500 < m < 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];

如果可以消除第二遍(获取字节偏移量)会很好,但我还没有找到如何做到这一点......此外,这些字节偏移量可以写入文件(类似于记录的处理方式) 然后一次读回一个,如果仍然存在内存问题。

4

1 回答 1

0

为了给出答案,您的第二遍可以简洁地写成:

strm = OpenRead[fname];
ByteIndx=Reap[While[Sow[StreamPosition[strm]]; !TrueQ[Read[strm ] == EndOfFile]]][[2,1,;;-2]]
n=Length[ByteIndx]
于 2013-02-14T18:49:17.130 回答