一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

統(tǒng)計(jì)一個(gè)大文本行數(shù)的幾種方法以及效率統(tǒng)計(jì)(一)

 ruiruiruiruichen 2013-08-28



最近在和一個(gè)朋友的交流中,遇到這么一個(gè)問題,如何能較快對(duì)一個(gè)較大的文本文件(1G或更大)的文本行數(shù)進(jìn)行統(tǒng)計(jì)。如果不考慮效率,要統(tǒng)計(jì)一個(gè)文本的行數(shù)其實(shí)一點(diǎn)也不難,但是如果需要在較快的時(shí)間內(nèi)做完,恐怕就得考慮實(shí)現(xiàn)方法了。


為此,自己嘗試了幾種方法,在這里把這幾種方法拿出來(lái)和大家討論一下。


首先是生成測(cè)試數(shù)據(jù)的代碼:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int COL_NUM = 30;
const int LINE_NUM = 10000000;
const string FILE_NAME = @"d:\test.csv";
/// <summary>
/// 創(chuàng)建一個(gè)一千萬(wàn)行的文本文件,大小約為900M。
/// </summary>
static void CreateTestCSVFile()
{
    string rowValue = string.Join(string.Empty,
        Enumerable.Range(1, COL_NUM).Select(i => i.ToString("00") + ","));
     
    using (StreamWriter sw = new StreamWriter(FILE_NAME, false, Encoding.ASCII))
    {
        for (int i = 0; i < LINE_NUM; i++)
        {
            sw.WriteLine(rowValue);
        }
    }
}

.NET4.0 + StreamReader + ReadLine()


原理很簡(jiǎn)單,使用StreamReader的ReadLine方法,每執(zhí)行一次,行數(shù)加一。代碼如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// StreamReader + ReadLine()
/// </summary>
static void CalculateLine_ReadLine()
{
    long lineCount = 0;
    using (StreamReader sr = new StreamReader(FILE_NAME, false))
    {
        while (!sr.EndOfStream)
        {
            sr.ReadLine();
            lineCount++;
        }
    }
    Console.WriteLine("line count: {0}", lineCount);
}

測(cè)試結(jié)果如下:


StreamReader ReadLine()


對(duì)于以上這種方法,平均每次執(zhí)行時(shí)間為55s左右,執(zhí)行效率明顯不盡如人意。


如果我們同樣采用流,不過(guò)使用分塊的方式,將文件內(nèi)容一塊一塊讀進(jìn)內(nèi)存,在解析每塊內(nèi)容的行數(shù),最后相加。這樣做的效率如何呢?


.NET4.0 + StreamReader + ReadBlock()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// <summary>
/// StreamReader + ReadBlock()
/// </summary>
static void CalculateLine_ReadBlock(int oneBlockSize)
{
     
    long lineCount = 0;
    char[] oneBlock = new char[oneBlockSize];
    using (StreamReader sr = new StreamReader(FILE_NAME, false))
    {
        long streamLen = sr.BaseStream.Length;
        while (!sr.EndOfStream)
        {
            long leftLength = streamLen - sr.BaseStream.Position - 1;
            if (leftLength >= oneBlockSize)
            {
                sr.ReadBlock(oneBlock, 0, oneBlock.Length);
                lineCount += oneBlock.Count(c => c == '\r');
            }
            else
            {
                lineCount += sr.ReadToEnd().Count(c => c == '\r');
            }
        }
    }
    Console.WriteLine("line count: {0}", lineCount);
}
static void Main(string[] args)
{
    int[] oneBlockArray = new[] { 1, 10, 20, 50, };
    foreach (int oneBlockSize in oneBlockArray)
    {
         
        CodeTimerF2.CodeTimer.Time(string.Format("StreamReader + ReadBolck() [Block Size: {0}MB]", oneBlockSize),
            1, () => CalculateLine_ReadBlock(oneBlockSize * 1024 * 1024));
    }
     
    Console.ReadKey();
}

運(yùn)行結(jié)果如圖:


StreamReader ReadBlock()

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产午夜精品久久福利| 国产免费黄片一区二区| 国产精品久久精品国产| 99热九九在线中文字幕| 99久久国产精品成人观看| 高清一区二区三区四区五区| 99久久精品国产麻豆| 亚洲精选91福利在线观看| 日本免费熟女一区二区三区| 亚洲欧美日韩国产成人| 亚洲天堂有码中文字幕视频| 日韩aa一区二区三区| 老熟女露脸一二三四区| 在线观看视频日韩成人| 又大又紧又硬又湿又爽又猛| 欧洲偷拍视频中文字幕| 日韩欧美国产精品自拍| 精品欧美日韩一区二区三区| 国产午夜精品久久福利| 亚洲国产欧美久久精品| 日韩欧美一区二区不卡看片| 久久精品国产99精品亚洲| 91亚洲精品国产一区| 99久久国产精品成人观看| 尹人大香蕉中文在线播放| 国产精品午夜一区二区三区 | 中文字幕一区二区三区中文| 日韩成人h视频在线观看| 国产精品一区二区高潮| 欧美美女视频在线免费看| 国产一区二区三区丝袜不卡| 91亚洲精品国产一区| 国产一级内片内射免费看| 日韩免费国产91在线| 自拍偷女厕所拍偷区亚洲综合| 欧美特色特黄一级大黄片| 国产成人免费高潮激情电| 欧美成人一区二区三区在线| 色鬼综合久久鬼色88| 免费亚洲黄色在线观看| 日本91在线观看视频|