Laden...

Forenbeiträge von janDD Ingesamt 10 Beiträge

25.09.2012 - 12:42 Uhr

man kann mit jedem mathematischen objekt rechnen, zum beispiel mit differentialformen, sogar mit objekten die man gar nicht wirklich hinschreiben kann (zum beispiel nicht riemann-integrierbare funktionen).

deine fragen sind natürlich alle richtig. würde ich das system von grund auf designen würde ich es nicht so machen. aber da ich schon sehr viel code (übernommen) habe, der eine datatable erfordert, würde ich ihn eben gern nachnutzen ...

aber danke für deine hilfe. ich würde den thread hiermit mal schließen...

@CoLo ... ein Beispiel habe ich ja schon des öfteren genannt: ANOVA

25.09.2012 - 08:51 Uhr

Hallo,

ja, schon klar. Aber ich sagte doch mehrfach, dass ich die Datenbank-Alternative kenne, aber die Umsatz enormen Aufwand benötigt. Das hat nichts mit aufstampfen oder "die Vorschläge nicht umsetzen wollen" zu tun.

Ich habe eben in diversen Beiträgen im Netz gelesen, dass man mit Hilfe von memory mapped files solcher Speicherprobleme herr werden kann, aber kein Beispiel gefunden.

das wort "berechnungen" steht in diesem zusammenhang für die unterschiedlichsten analysen stichwort kontingenzanalyse, commonality analysen, kategoriale logistische korrelation ...

man kann nicht nur mit zahlen rechnen, wobei natürlich auch zahlen in der datatable stehen ...

24.09.2012 - 16:31 Uhr

or leute ... ich hab schon mehrere schemata designed in allen möglichen normalformen.
mein problem ist, dass ich sehr sehr umfangreiche berechnungen mit der datatable anstelle und dafür sind schon alle methoden fertig (>20000 Zeilen code!) und mit kleineren files in benutzung, getestet usw. usf.
die möchte ich gern verwenden, ohne ein halbes jahr mich mit irgendwelchen neuen sql schnipseln rumzuärgern.

daher würde ich gern irgendwie (und wenn es noch so absurd ist) meine daten in eine datatable haben ...

ist das sooooo unverständlich?

aber vielleicht gibt es ja wirklich keinen weg. aber bitte nicht mehr eine datenbank vorschlagen ...

jan

24.09.2012 - 15:48 Uhr

Prozessdaten...
Ja sicher kann ich 10000 Zeilen draus machen ... und aus den 12000 Zeilen dann 12000 Spalten?
Ja, ich könnte die Tabellen auch normalisieren ... aber um meine Analyse zu machen, muss ich sie wieder zusammenführen ...

Es gibt in C# ja sowas wie memory mapped files ... kann ich sowas vllt. für meine DataTable nutzen ... ?

24.09.2012 - 15:00 Uhr

eine datenbank, die tabellen mit mehr als 10000 spalten erlaubt, ist mir gar nicht bekannt ...

24.09.2012 - 14:23 Uhr

Hm, verstehe.
die datatable übergebe ich normalerweise bestimmten funktionen, die die berechnungen anstellen. das zeilenweise zu machen, wäre ein riesiger aufwand ...

gibt es denn vllt. eine möglichkeit, die datatable auf platte zu swappen, sobald sie aus dem ram läuft?

21.09.2012 - 17:04 Uhr

Nein, es ist eben nicht "natürlich", dass er abstürzt. Meine Methode 1 läuft problemlos.
MaW, ich kann problemlos eine DataTable mit 15000 Spalten und 15000 Zeilen anlegen, die den teststring "this is a relatively long string to test memory for a datatable" enthalten.

Die Kombination aus einlesen + datatable anlegen ist der knackpunkt. Aber mir ist nicht klar wo, denn schließlich liest der Streamreader ja immer nur eine Zeile. Scheinbar räumt der Garbage Collector die Zeilen nicht vernünftig wieder weg oder der Streamreader ist buggy ... k.a.

Und ja ... ich brauche die große Datei (um verschiedene Statistiken zu berechnen, Stichwort ANOVA)

@CoLo: wenn ich alles auskommentiere, läuft es durch. Es läuft sogar durch, wenn ich statt


r[i] = row[i];

folgendes schreibe


r[i] = "this is a relatively long string to test memory for a datatable";

Das ist mir völlig uklar. Denn auch hier rattert der Streamreader über alle Zeilen...
Mhmm..

Grüße,
Jan

21.09.2012 - 14:35 Uhr

Ja, er stürzt beim ReadLine ab ... aber das ist m.E. Zufall --- es ist halt die erste Funktion, die nicht mehr genug Speicher bekommt...

Ich hab es auch mal Deinen Vorschlag verwendet, den String zeichenweise zu durchlaufen ... gleiches Problem

Grüße,
Jan

21.09.2012 - 13:29 Uhr

Hi,

die Größe der Datei ist 1gb. Die Strings sind aber kürzer als mein Teststring "this is a relatively long string to test memory for a datatable" und die CSV-Datei hat weniger Spalten/Zeilen als meine künstlich erstellte DataTable -- daran kann's also nicht liegen.

Grüße,

21.09.2012 - 10:51 Uhr

verwendetes Datenbanksystem: <CSV>

Hallo,
ich scheitere beim Einlesen großer CSV Dateien in eine DataTable an einer OutOfMemoryException (Methode getDataTableFromCSV1).

Das Anlegen einer wesentlich größeren DataTable funktioniert aber (Methode generateDataTable). Die Strings in dem CSV sind übrigens deutlich kleiner als der test-string.

Ich habe schon allerhand gelesen, dass die String.Split()-Methode das Problem sein könnte, aber ich weiß nicht, wie ich diese umgehen könnte ...

Ich habe auch schon den LUMEN CSV Parser verwendet - auch hier ein OutOfMemory.

Bevor jemand fragt: Ja, ich brauche alle Daten (um Statistiken zu berechnen - ANOVAs etc).

Danke und Gruß,

Jan

 

using System.IO;
using System.Text;
using System.Data;

namespace CSVImport
{
    public class Class1
    {

        static void Main(string[] args)
        {

           
            // works 15000 columns x 15000 rows, process takes around 1.2gb
            generateDataTable();

            // out of memory, only 9000 columns x 12000 rows, process > 1.8gb
            getDataTableFromCSV("C:\test.csv", bool verbose)

         }

    }

   private static void generateDataTable()
        {

            TimeSpan tStart = (DateTime.UtcNow - new DateTime(1970, 1, 1));

            DataTable dt = new DataTable(); 
            for (int i = 0; i < 15000; i++)
            {
                dt.Columns.Add(new DataColumn("column "+i.ToString(),typeof(string)));
            }

            for (int j=0; j<15000; j++){
                
                DataRow r = dt.NewRow();
                for (int i = 0; i < 15000; i++)
                {

                    r[i] = "this is a relatively long string to test memory for a datatable";
   
                }
                dt.Rows.Add(r);
            }

            TimeSpan tNow = (DateTime.UtcNow - new DateTime(1970, 1, 1));
            if (true)
            {
                Console.WriteLine(tNow.TotalSeconds - tStart.TotalSeconds);
            }


            Console.WriteLine("Columns: " + dt.Columns.Count.ToString());
            Console.WriteLine("Rows: " + dt.Rows.Count.ToString());


        }

       public static DataTable getDataTableFromCSV(string path, bool verbose){

            DataTable dt = new DataTable(path);
            TimeSpan tStart = (DateTime.UtcNow - new DateTime(1970, 1, 1));

            try
            {
                using (StreamReader readFile = new StreamReader(@path))
                {
                    string line;
                    string[] row;
                    bool isFirstLine = true;

                    while ((line = readFile.ReadLine()) != null)
                    {
                        row = line.Split(',');
                        if (isFirstLine)
                        {
                            foreach (string column in row)
                            {
                                dt.Columns.Add(column);
                              }
                          isFirstLine = false;
                        }
                        else
                        {

                            DataRow r = dt.NewRow();
                            for (int i = 0; i < row.Length; i++)
                            {
                                r[i] = row[i];
                            }
                            
                           dt.Rows.Add(r);
                           
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            TimeSpan tNow = (DateTime.UtcNow - new DateTime(1970, 1, 1));
            if (verbose)
            {
                Console.WriteLine(tNow.TotalSeconds - tStart.TotalSeconds);
            }

            return dt;

        }
}