2013-02-13 28 views
3

我有一個包含n個「記錄」的大文件(用Mathematica編寫),每個記錄都是一個固定長度爲m的列表,其中n> 10,000和500 < m < 600(字節)。請注意,我的系統無法保存內存中的所有記錄---將它們寫入文件的原因。我有一個應用程序(在Mathematica中)需要以相反的順序處理這些記錄;即寫出的最後一條記錄是要處理的第一條記錄。我怎樣才能以相反的順序從文件中讀取這些記錄?在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]; 

這將是很好,如果第2次(以獲得字節偏移量)可能會被淘汰,但我還沒有找到如何做到這一點又......而且,這些字節偏移可以寫入到一個文件(類似於記錄的處理方式),然後一次一個讀回,如果仍然存在內存問題。

+0

這讓我想到,我會使用O/S實用程序排序扭轉文件,然後在數學閱讀。 – 2013-02-13 17:52:03

+0

在你的例子中,每條記錄都是一個數學表達式。這是否真的反映了你實際上想要讀的內容?如果是這樣,我認爲你的一般方法是最好的,你可以做的(如果你反向排序,你可能不會有有效的表達式來簡單地閱讀[]。) – agentp 2013-02-13 21:44:32

+0

我不知道如何解釋你的評論。但是,現在我可以說我已經在我的卡爾曼濾波和RTS更平滑的應用中實現了這種方法,其中記錄是KF估計的協方差矩陣,並且它工作得很好。雖然,我還沒有想出如何消除第二關。任何建議,你可能有喬治將不勝感激。 – Birdy40 2013-02-13 21:57:00

回答

0

用於把一個答案的緣故,你第二次進行扼要地寫:

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