开发者

Finding elements from a memory mapped file in C#

I need to find certain elements within a memory mapped file. I have managed to map the file, however I get some problems finding the elements. My idea was to save all file elements into a list,开发者_开发百科 and then search on that list.

How do I create a function that returns a list with all elements of the mapped file?

// Index indicates the line to read from
public List<string> GetElement(int index) {

}

The way I am mapping the file:

    public void MapFile(string path)
    {
        string mapName = Path.GetFileName(path);
        try
        {
            // Opening existing mmf
             if (mapName != null)
             {
                 _mmf = MemoryMappedFile.OpenExisting(mapName);
             }

             // Setting the pointer at the start of the file
             _pointer = 0;

             // We create the accessor to read the file
             _accessor = _mmf.CreateViewAccessor();

             // We mark the file as open
             _open = true;
        }
        catch (Exception ex) {....}

        try
        {
            // Trying to create the mmf
            _mmf = MemoryMappedFile.CreateFromFile(path);

            // Setting the pointer at the start of the file
             _pointer = 0;

            // We create the accessor to read the file
            _accessor = _mmf.CreateViewAccessor();

            // We mark the file as open
            _open = true;
        }
        catch (Exception exInner){..}
    }

The file that I am mapping is a UTF-8 ASCII file. Nothing weird.

What I have done:

    var list = new List<string>();

    // String to store what we read
    string trace = string.Empty;

    // We read the byte of the pointer
    b = _accessor.ReadByte(_pointer);

    int tracei = 0;
    var traceb = new byte[2048];

    // If b is different from 0 we have some data to read
    if (b != 0)
    {
        while (b != 0)
        {
            // Check if it's an endline
            if (b == '\n')
            {
                trace = Encoding.UTF8.GetString(traceb, 0, tracei - 1);

                list.Add(trace);
                trace = string.Empty;

                tracei = 0;
                _lastIndex++;
            }
            else
            {
                traceb[tracei++] = b;
            }

            // Advance and read
            b = _accessor.ReadByte(++_pointer);
        }
    }

The code is difficult to read for humans and is not very efficient. How can I improve it?


You are re-inventing StreamReader, it does exactly what you do. The odds that you really want a memory-mapped file are quite low, they take a lot of virtual memory which you only can make pay off if you repeatedly read the same file at different offsets. Which is very unlikely, text files must be read sequentially since you don't know how long the lines are.

Which makes this one line of code the probable best replacement for what you posted:

string[] trace = System.IO.File.ReadAllLines(path);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜