středa 19. července 2017

StreamReader nebo ReadAll

Výsledek obrázku pro performanceV miniseriálu o funkcionálním programování jsem se zabýval zpracováním CSV souboru. Soubor, tedy textový dokument, jakým je CSV, můžeme v zásadě zpracovávat dvěma způsoby: vše načíst do paměti a nebo využít stream.


Tedy buď: 

var lines = File.ReadAllLines(fileName);
foreach (var line in lines)
{

    ...
   

a nebo


using (var reader = new StreamReader(fileName))
{
     while ((line = reader.ReadLine()) != null)
    {
          ...


Každý z těchto přístupů má své pro a proti a rozdíly vyniknou zejména při zpracování velkých souborů, například zpracování CSV s cca jedním miliónem řádků o velikosti cca 800 MB vypadá takto:

Pro ReadAllLines:

Pro StreamReader:

Čtení po řádcích, tedy s využítím StreamReaeru, znamená citelně menší zabranou paměť, čas nutný na přečtení souboru je ale o cca 5-10% delší než pro ReadAllLines. Ovšem tam za toto zrychlení platíme pamětí, které je potřeba cca 9-krát více.

Samozřejmě že u malých, běžně zpracovávaných souborů, je to skoro jedno, ale pokud potřebujeme zpracovat delší soubor, je dobré vědět o těchto rozdílech.

2 komentáře:

  1. I must thank you for the efforts you have put in penning this site. I am hoping to check out the same high-grade content by you later on as well. In truth, your creative writing abilities has inspired me to get my own, personal blog now..
    UGC Approved Journals
    UGC Recognized Journals
    Scopus Indexed Journals
    Scopus Journal List
    Proof Reading

    OdpovědětVymazat