Intellisense   zodpovězená otázka

VB.NET

soubor http://www.madoverlord.com/lotsofwords.t... (353803 řádků = slov)

 Dim strr2 As New StreamReader(Path.Combine(Application.StartupPath, "lotsofwords2.txt"), True)


While strr2.EndOfStream = False
                        ComboBox1.AutoCompleteCustomSource.Add(strr2.ReadLine)
                        Application.DoEvents()
                        ss.ProgressBar1.Value = strr2.BaseStream.Position
                        ss.Label2.Text = FormatPercent((ss.ProgressBar1.Value / ss.ProgressBar1.Maximum), 2, TriState.True, TriState.UseDefault, TriState.UseDefault)
                    End While
'vlastnosti comboboxu
combobox1.AutoCompleteMode  = SuggestAppend
combobox1.autocompletesource = CustomSource

Soubor se načte, ale trvá to přes 1,5 hodiny

(ss = splashscreen)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Otázka je, zda se vyplatí načítat takové gigantické množství textu pro účely IntelliSense (kolik to tak může využívat paměti?). Já bych to udělal tak, že zdroj dat pro IntelliSense by byly výrazy, které uživatel už někdy zadával.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je samozřejmě pravda, ale mě by hlavně zajímalo, proč to trvá tak dlouho? Když jsem to načítal do listu, tak to trvalo max. minutu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A co trvá dlouho (zkoušet se mi to nechce), načítání ze streamu, nebo přiřazení zdroje dat do AutoCompleteSource? Pokud je to ten druhý případ, podívejte se Reflectorem na Set té vlastnosti co se tam všechno dělá a najdete příčinu dlouhého trvání.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Application.DoEvents()

Pokaždé zpracováváte přidání (graficky, atd.), přidávejte do seznamu a pak přidávejte celý seznam.

viz.

ComboBox1.AutoCompleteCustomSource.AddRange

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Vyskúšal som ten Váš kód na mojom počítači, načítanie Vášho súboru bez tohto riadku (ComboBox1.AutoCompleteCustomSource.Add) trvá asi 104 sek., s tým riadkom cca 8 min. ale aj to je do 1.5 hodiny veľmi ďaleko.......

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě jsem asi poslal špatný kód nebo jste nestáhl ten soubor celý (mě se to taky stalo, protože každý prohlížeč ten soubor otevírá postupně a nechce stáhnout) měl by mít asi 350000 řádků = slov = stringů v listu)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mal by som ho mať celý má to vyše 4 megabajty, začína slovom "100th" a končí slovom "zyzzogeton" v PSPAD editore mi to ukazuje

353083 riadkov (slov),každé slovo v jednom riadku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu s tými 8 min som Vás trochu dezinformoval nemal som vtedy čas nechať to dobehnúť celé tak som pri 25% pozrel čas a vynásobil 4. Ono to ale funguje tak že pridávanie položiek sa časovo spomaľuje s množstvom položiek ktoré už combobox obsahuje t.j. pridávanie položiek z konca zoznamu trvá omnoho dlhšie ako zo začiatku. Nechal som to prebehnúť celé asi 3 x časy sa v skutočnosti pohybovali okolo 32 min.

Narýchlo som to skúsil s týmto kódom

Dim strr2 As New StreamReader(Path.Combine(Application.StartupPath, "c:\test\a.txt"), True)

        Dim Stopky As New Stopwatch()
        Stopky.Start()

        Dim ddd As Double = strr2.BaseStream.Length

        ProgressBar1.Maximum = ddd + 1

        While strr2.EndOfStream = False
            ComboBox1.AutoCompleteCustomSource.Add(strr2.ReadLine)
            Application.DoEvents()
            ProgressBar1.Value = strr2.BaseStream.Position
            Label2.Text = FormatPercent((ProgressBar1.Value / ProgressBar1.Maximum), 2, TriState.True, TriState.UseDefault, TriState.UseDefault)
        End While


        Stopky.Stop()

        Dim cass As TimeSpan = Stopky.Elapsed
        Label3.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:000}", cass.Hours, cass.Minutes, cass.Seconds, cass.Milliseconds)

Pri tak veľkom objeme údajov a časovej náročnosti je to reálne nepoužiteľné. Možno by pomohlo načítať len časť údajov napr.podľa prvého písmena ktoré zadá užívateľ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Winforms ani WPF komponenty obecně nemají rády, když do nich cpete gigantická množství dat.

Pokud bych takovouto funkci potřeboval, napsal bych si to napovídání sám.

Navíc ukládat celý seznam slov v paměti nemusí být úplně ideální, možná by se z toho dal udělat nějaký strom (ale musel by být nějak inteligentně vymyšlený, aby nezabral víc paměti než ty stringy). Určitě by to v něm pak daleko lépe vyhledávalo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback