Archief - [PROG][C#] HashTables met veel data geeft problemen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

NecroNeo

Legacy Member
Ik heb een tekstbestand waarvan elke regel er zo uitziet

NAAM1 NAAM2 float (gescheiden door tabs)

Ik heb een manier om dit in te laden naar een hashtable in een hashtable. En dit werkt perfect met een kleine versie van het bestand 3 megabyte.

Probleem is dat ik graag het volledige bestand 500Mb zou willen inladen en dat geeft problemen.

Ziet iemand hier een oplossing voor? Mijn gedacht is momenteel het bestand in stukken inladen. Maar dit is niet altijd een geschikte oplossing (stel dat ik maar 1 gegeven nodig heb, dan moet ik het volledige bestand inladen).

Code:
using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Globalization;


namespace Expression
{
    public class ExpressionData
    {
        private Hashtable Data;

        public ExpressionData()
        {
            Data = new Hashtable();
        }

        private void Add(string Accession1, string Accession2, float ExpressionLevel)
        {
            if (!Data.ContainsKey(Accession1.ToLower()))
            {
                Data.Add(Accession1.ToLower(), new Hashtable());
                ((Hashtable)Data[Accession1.ToLower()]).Add(Accession2.ToLower(), ExpressionLevel);
            }
            else
            {
                ((Hashtable)Data[Accession1.ToLower()]).Add(Accession2.ToLower(), ExpressionLevel);
            }
        }

        public void Load(string filename)
        {
            CultureInfo culture = new CultureInfo("en-US");


            TextReader tr = new StreamReader(filename);
            string S;
            while ((S = tr.ReadLine()) != null)
            {
                string[] parts = S.Split('\t', '\n');
                Add(parts[0].ToLower(), parts[1].ToLower(), float.Parse(parts[2],culture));
                Add(parts[1].ToLower(), parts[0].ToLower(), float.Parse(parts[2], culture));
            }

            tr.Close();
        }

        public float GetValue(string Accession1, string Accession2)
        {
            if (Data.ContainsKey(Accession1.ToLower()))
            {
                Hashtable temp = ((Hashtable)Data[Accession1.ToLower()]);
                if (temp.ContainsKey(Accession2.ToLower()))
                {
                    return ((float)temp[Accession2.ToLower()]);
                }
                else return (float)0;
            }
            else return (float)0;
        }

    }
}

WHiSPy

Legacy Member
Kan je niet gewoon meer memory alloceren voor je stack? Zoveel gegevens in memory bijhouden gaat er natuurlijk wel voor zorgen dat je programma heel traag kan worden, maar toch.

jodeman

Legacy Member
check de max en hashtables in een collectie? :)
@ Whispy : met hashtable is dat niet trager.

NecroNeo

Legacy Member
ik ga het oplossen door gegevens in een mysqldatabase te laden en daarmee te connecteren zal voor 'n bestand van 500 meg wss 'n stuk sneller zijn dan proberen alles in het geheugen te laden

Deze thread mag wat mij betreft gesloten worden.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan