簡體   English   中英

從驅動器讀取大部分文件

[英]Reading parts of large files from drive

我正在使用C#中的大文件(可以達到可用內存的20%-40%),我只需要將一小部分文件一次加載到內存中(比如1-2%的文件) )。 我在想使用FileStream是最好的選擇,但是idk。 我需要給出一個起點(以字節為單位)和一個長度(以字節為單位)並將該區域復制到byte []中。 可能需要在線程之間共享對文件的訪問,並且該文件將位於文件中的隨機位置(非線性訪問)。 我也需要快速。

該項目已經有unsafe方法,所以請隨意從C#更危險的一面提出建議

FileStream將允許您搜索所需文件的部分,沒問題。 這是在C#中使用它的推薦方法,而且速度很快。

線程之間共享:您需要創建一個鎖,以防止其他線程在您嘗試從中讀取時更改FileStream位置。 最簡單的方法:

//  This really needs to be a member-level variable;
private static readonly object fsLock = new object();

//  Instantiate this in a static constructor or initialize() method
private static FileStream fs = new FileStream("myFile.txt", FileMode.Open);


public string ReadFile(int fileOffset) {

    byte[] buffer = new byte[bufferSize];

    int arrayOffset = 0;

    lock (fsLock) {
        fs.Seek(fileOffset, SeekOrigin.Begin);

        int numBytesRead = fs.Read(bytes, arrayOffset , bufferSize);

        //  Typically used if you're in a loop, reading blocks at a time
        arrayOffset += numBytesRead;
    }

    // Do what you want to the byte array and return it

}

根據需要添加try..catch語句和其他代碼。 無論你到哪里訪問這個FileStream,都要鎖定成員級變量fsLock ...這會阻止其他方法在你試圖讀取時讀取/操作文件指針。

速度方面,我認為你會發現你受到磁盤訪問速度的限制,而不是代碼。

您將不得不考慮有關多線程文件訪問的所有問題...誰初始化/打開文件,誰關閉它等等。有很多理由可以覆蓋。

我對這些文件的結構一無所知,但是使用FileStream或類似的聲音讀取文件的一部分聽起來是最好和最快的方法。

您不需要復制byte [],因為FileStream可以直接讀入字節數組。

聽起來您可能對文件的結構有更多了解,這也可能帶來其他技術。 但是如果你只需要讀取文件的一部分,那么這可能就是這樣做的方法。

如果您正在使用.Net 4,請查看System.IO.MemoryMappedFiles命名空間中的內存映射文件。

它們非常適合從大文件中讀取小塊。 MSDN文檔中有一些示例

您也可以在早期版本的.Net中執行此操作,但是您需要包裝Win32 API(或使用http://winterdom.com/dev/net ),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM