Nagy fájl kezelése,betöltése!

Nagy fájl kezelése,betöltése!
2012-11-30T19:54:47+01:00
2012-12-03T09:48:50+01:00
2022-07-19T05:36:38+02:00
StarFighter
Sziasztok!

Van egy CSV fájlom, ami több mint 280ezer sort tartalmaz. Ennek a tartalmát szeretném betölteni listába ill. egy dataGridViewbe.

Eddigi probálkozásaim eredménye outofmemoryexception!

Ha van valakinek otlete az indokolja is meg h miert az ami. Hülyeségeket linkelni én is tudok magamnak.
Köszi!
Mutasd a teljes hozzászólást!
Semmmi szükség nincs db-re. 280K rekord, ha mind 1K-s, az sem több 280 MB-nál... Ehhez miért is kéne SQL? Tök jó ha simán beolvasod soronként -ahogy én mutattam- egy-egy objektumba, és mehet a LinQ...

Létrehozol egy ObservableCollectiont, amibe belehelyezed az első 100-at, meg egy két navigáló gombot, köv. 100, előző 100. És már is lehet a Gridben megjeleníteni (bindinggal), LinQval lehet szűrni.
Mutasd a teljes hozzászólást!

  • Szerintem a 13. sorban feleslegesen foglalsz le egy 10 MB-os MemoryStream-et a ciklusodban.
    Mutasd a teljes hozzászólást!

  • Ezt használom a fájlok olvasásához.
    using (System.IO.StreamReader file = new System.IO.StreamReader(item.ToString(), Encoding.Default)) { while ((line = file.ReadLine()) != null) { string[] words = line.Split(';'); wordL1.Add(words[0]); wordL2.Add(words[1]); } }
    Mutasd a teljes hozzászólást!
  • áruld már el minek minek akarsz egyszerre ennyi sort betölteni.
    Miért nem csak annyit, amennyi egyszerre átlátható?
    Mutasd a teljes hozzászólást!
  • Danténak igaza van, valószínűleg nem ezzel a résszel van a gond, hanem a DataGridView-d akad ki.

    Tedd a CSV tartalmát egy osztályba, és Linq-kel szépen tudod szűrni.

    Csak azt jelenítsd meg, amit feltétlenül muszáj. Senki nem fog böngészni 280 ezer sort, keresni akarnak majd benne.
    Mutasd a teljes hozzászólást!
  • Csak a vizuális megjelenítés kedvéért akartam.
    Eddig csak pár száz tétellel dolgoztam. CSV tartalmát adatbázisba tárolom le, táblában pedig megjeleníti mely sorokat sikerült feltöltenie és melyeket nem.

    "Tedd a CSV tartalmát egy osztályba, és Linq-kel szépen tudod szűrni."

    Ezt hogy tudom megvalósítani? Ilyet még nem cs inaltam.
    Mutasd a teljes hozzászólást!
  • Ezt tessek tanulmanyozni egy kicsit:


    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { var _etelek = new List<Elemiszer> { new Elemiszer{Name = "alma", Tipus = EtelTipus.Gyumolcs}, new Elemiszer{Name = "korte", Tipus = EtelTipus.Gyumolcs}, new Elemiszer{Name = "szilva", Tipus = EtelTipus.Gyumolcs}, new Elemiszer{Name = "banan", Tipus = EtelTipus.Gyumolcs}, new Elemiszer{Name = "ananasz", Tipus = EtelTipus.Gyumolcs}, new Elemiszer{Name = "tarja", Tipus = EtelTipus.Hus}, new Elemiszer{Name = "felsal", Tipus = EtelTipus.Hus}, new Elemiszer{Name = "comb", Tipus = EtelTipus.Hus}, new Elemiszer{Name = "nyak", Tipus = EtelTipus.Hus}, }; var _husok = _etelek.Where(e => e.Tipus == EtelTipus.Hus).ToList(); Console.WriteLine("Husok"); foreach (var h in _husok) Console.WriteLine("\t{0}", h.Name); var _gyumik = _etelek.Where(e => e.Tipus == EtelTipus.Gyumolcs).ToList(); Console.WriteLine("Gyumik"); foreach (var h in _gyumik) Console.WriteLine("\t{0}", h.Name); Console.Read(); } } enum EtelTipus { Gyumolcs, Hus } class Elemiszer { public string Name { get; set; } public EtelTipus Tipus { get; set; } } }
    Mutasd a teljes hozzászólást!
  • Rendben,ezt értem. Litában sem fér el szerintem ennyi adat.
    Mutasd a teljes hozzászólást!
  • Kiszedtem a dataGridView-et így 1 másodperc alatt beolvasta a 280k + rekordot. Eleg lassan tolti fel az adatbazisba.
    Mutasd a teljes hozzászólást!
  • 1. A "lassú" egy elég relatív fogalom, nehéz megmondani, hogy a te esetedben ez tényleg ilyen, vagy lehet rajta optimalizálni.

    2. Az adatbázisba feltöltésnél is be lehet iktatni lassító tényezőket (pl. minden rekordnál újracsatlakozol stb.). Kód és pontos adatok nélkül nehéz véleményezni.

    3. Amennyiben egy rekordod mondjuk kisebb, mint 1 kb, nem feltétlenül kell adatbázist használnod, ennyi bőven elfér a memóriában.

    (Én nem tudom, mi az a Lita.)
    Mutasd a teljes hozzászólást!
  • OFF
    (Én nem tudom, mi az a Lita.)

    Lehet pl Zita
    azt tudod-e, hogy ha a "mama" betűiből elveszünk egyet és a többit megváltoztatjuk, akkor azt kapjuk "sör"

    ON
    Szóval ha jól értem, akkor a csv-t akarod adatbázisba rakni??
    Azt csak egyszer kell megoldani.
    Kapcsolat megnyit
    - ciklus
    ----olvas file
    ---- ir adatbázis
    ---- mutat progressbar
    ---- mutat hiba ha van
    - ciklus vége
    Adatbázis kapcsolat lezár

    280 ezer rekord nem fog másodpercek alatt beíródni


    ON2
    megnézed milyen adatbázis szerkesztő progik vannak
    én sqlyog-ot használok
    abban lehet csv-be exportálni, szóval van rá esély. hogy importálni is
    Mutasd a teljes hozzászólást!
  • Lista, nem kell hozzá sok logika, csak véletlen lemaradt egy betű.
    Mutasd a teljes hozzászólást!
  • MS SQL Server 2008-at használok, importálás nem jó az én esetemben, mivel feltöltés előtt meg kell felelnie néhány feltételnek. Feltöltés most mellékes,csak megjegyzésként írtam azt h lassú. (Több mint 3 óra kellett mire végzett.)

    KukiPapa és Elvira tanácsai hasznosak!

    Linq szűréssel szerintem megoldható lesz a darabolt feldolgozás.

    Mutasd a teljes hozzászólást!
  • Semmmi szükség nincs db-re. 280K rekord, ha mind 1K-s, az sem több 280 MB-nál... Ehhez miért is kéne SQL? Tök jó ha simán beolvasod soronként -ahogy én mutattam- egy-egy objektumba, és mehet a LinQ...

    Létrehozol egy ObservableCollectiont, amibe belehelyezed az első 100-at, meg egy két navigáló gombot, köv. 100, előző 100. És már is lehet a Gridben megjeleníteni (bindinggal), LinQval lehet szűrni.
    Mutasd a teljes hozzászólást!
  • Azért kell az adatbázis mert egy online több felhasználós alkalmazásról van szó. Az adatok menedzseléséhez pedig most egy külön alkalmazást csinálok.

    Köszi az ötletet,kipróbálom,aztán szólok hogy mire jutottam.
    Mutasd a teljes hozzászólást!
  • Én kérek elnézést, hogy a félszavaidból nem tudom kitalálni, mire gondolsz.
    Mutasd a teljes hozzászólást!
  • Ha 3 óra volt 280K rekord betöltése ott vmi el van b@szva... Tipikusan nem egy tranzakcióban történik beírás, ilyenkor szokott marha lassú lenni a dolog.

    Kapcsolat kiépít.
    Tranzakció megnyit.

    Adat bepumpál.

    Tranzakció commit.
    Kapcsolat bezár.
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséged!
    Ma átalakítom az SQL részét.
    Mutasd a teljes hozzászólást!
  • Nagyon szívesen.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd