已有142人关注
C#内存映射文件查找2G.dat16进制大文件中特定00 11 22,所用多长时间,以下代码需要修改哪里,才能实现
发表在C#答疑区 2017-10-31 悬赏:15 学分
是否精华
版块置顶:

using System;

using System.IO;

using System.IO.MemoryMappedFiles;

using System.Text;

namespace app1

{    class Program

    {

        private const string DAT_FILE_PATH = @"F:test.dat";

        private const string SPLIT_VARCHAR = "";

        private const char SPLIT_CHAR = '';

        private static long FILE_SIZE = 0;

        static void Main(string[] args)

        {

            long ttargetRowNum = 10000000;

            DateTime beginTime = DateTime.Now;

            string line = CreateMemoryMapFile(ttargetRowNum);

            double totalSeconds = DateTime.Now.Subtract(beginTime).TotalSeconds;

            Console.WriteLine(line);

            Console.WriteLine(string.Format("查找第{0}行,共耗时:{1}s", ttargetRowNum, totalSeconds));

            Console.ReadLine();

        }

        private static string CreateMemoryMapFile(long ttargetRowNum)

        {

            string line = string.Empty;

            using (FileStream fs = new FileStream(DAT_FILE_PATH, FileMode.Open, FileAccess.ReadWrite))

            {

                long targetRowNum = ttargetRowNum + 1;//目标行

                long curRowNum = 1;//当前行

                FILE_SIZE = fs.Length;

                using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(fs, "test1", fs.Length, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.None, false))

                {

                    long offset = 0;

                    int limit = 200;

                    try

                    {

                        StringBuilder sbDefineRowLine = new StringBuilder();

                        do

                        {

                            long remaining = fs.Length - offset;

                            using (MemoryMappedViewStream mmStream = mmf.CreateViewStream(offset, remaining > limit ? limit : remaining))

                                     {

                                offset += limit;

                                using (StreamReader sr = new StreamReader(mmStream))

                                {

                                    string ss = sr.ReadToEnd().ToString().Replace("\n", SPLIT_VARCHAR).Replace(Environment.NewLine, SPLIT_VARCHAR);

                                    if (curRowNum <= targetRowNum)

                                    {

                                        if (curRowNum < targetRowNum)

                                        {

                                            string s = sbDefineRowLine.ToString();

                                            int pos = s.LastIndexOf(SPLIT_CHAR);

                                            if (pos > 0)

                                                sbDefineRowLine.Remove(0, pos);


                                        }

                                        else

                                        {

                                            line = sbDefineRowLine.ToString();

                                            return line;

                                        }

                                        if (ss.Contains(SPLIT_VARCHAR))

                                        {

                                            curRowNum += GetNewLineNumsOfStr(ss);

                                            sbDefineRowLine.Append(ss);

                                        }

                                        else

                                        {

                                            sbDefineRowLine.Append(ss);

                                        }

                                    }

                                  


                                    sr.Dispose();

                                }


                                mmStream.Dispose();

                            }

                        } while (offset < fs.Length);

                    }

                    catch (Exception e)

                    {

                        Console.WriteLine(e.Message);

                    }

                    return line;

                }

            }

        }


        private static long GetNewLineNumsOfStr(string s)

        {

            string[] _lst = s.Split(SPLIT_CHAR);

            return _lst.Length - 1;

        }

    }

}


2017-10-31 14:40:39编辑
分享到:
精彩评论 2
小禾斗
学分:7348 LV13
TA的每日心情
奋斗
2017-04-21 14:00:25
2017-10-31
沙发

读者朋友:

  您好,该社区主要解决我们图书相关的问题,由于最近工作比较忙,所以对于不是图书中的问题,我们会抽时间给看一下,请耐心等待。

php编程新手
学分:43 LV2
2017-11-01
板凳

小禾斗 发表于2017-10-31 15:19

读者朋友:

  您好,该社区主要解决我们图书相关的问题,由于最近工作比较忙,所以对于不是图书中的问题,我们会抽时间给看一下,请耐心等待。

就告诉我嘛

首页上一页 1 下一页尾页 2 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照