Hm...: suchen DB bei 1.57 GB freiem Speicher

Hi Leute,

ich arbeite auf einer vm und habe nur 1,57 GB Speicherplatz frei, insgesamt hat die vm 23,8 GB.

Ich habe eine Liste mit folgenden Daten:
ID - Stack mit anderen IDs

Und möchte gucken, ob diese IDs bereits vorhanden sind. Dazu möchte ich die vorhandenen Ids in einer DB speichern. Kennt ihr ein DB System oder ähnliches mit dem ich mit 1,57 GB pysikalischem Speicher auskomme?

MySQL würde mir den Speicher komplett füllen.

mfg

  1. wenn ich die daten die ich haben will einfach in einer txt speichere komme ich vermutlich auf weniger als 200 MB, hierzu möchte ich allerdings noch die suchfunktion einer DB haben...

    gibt es bestimmte tricks so eine suchfunktion selber zu bauen? die ids sind integer, allerdings sehr große und ich weiß nicht ob eventuell irgendwann eine sehr kleine id hinzukommt, daher könnte das konstruieren einer ordner struktur kompliziert werden...

    1. meine idee die ich jetzt ausprobiere:

      ich lege für jeweils 1000 id's jeweils ein mit Lempelziff codiertes txt file an, dass mache ich so, dass ich abfragen kann, ob eine bestimmte id in einem bestimmten file liegt.

      bei abfragen muss ich dann einfach meine liste mit abzufragenden id's sortieren, damit ich nicht für jede id jeweils ein file öffnen muss.... der teufel schmeißt mit fliegen oder so ähnlich, sagt man glaube ich

      1. danke für die antworten, werde ich ausprobieren, wenn meine jetzige lösung nicht funktioniert.

        zu meiner jetzigen lösung:

        Exception in thread "main" java.lang.NumberFormatException: For input string: "2132537982400981464"

        bei keys.add(Integer.valueOf((String) it.next()));

        was kann ich hier tun? ^^

        1. lösungs idee: long statt int

          problem: arraylist frisst kein long....

          dann baue ich mal ne hashmap zum umwandeln der ids in richtige int......

          1. Hallo,

            lösungs idee: long statt int

            funktioniert auch nur solange die Zahl sich mit 64 Bit darstellen lässt, für größere Zahlen bietet Java dir BigInteger an.

            problem: arraylist frisst kein long....

            Eine List<Long> = new ArrayList<Long>() frisst sehr wohl long, aber eine List<Integer> = new ArrayList<Integer>() tut das nicht. Überprüfe die Generics mit denen du arbeitest

            dann baue ich mal ne hashmap zum umwandeln der ids in richtige int...

            Klingt eher nach Würgaround als solider Programmiertechnik.

            Gruß,
            andiv

            1. Hallo,

              lösungs idee: long statt int

              funktioniert auch nur solange die Zahl sich mit 64 Bit darstellen lässt, für größere Zahlen bietet Java dir BigInteger an.

              problem: arraylist frisst kein long....

              Eine List<Long> = new ArrayList<Long>() frisst sehr wohl long, aber eine List<Integer> = new ArrayList<Integer>() tut das nicht. Überprüfe die Generics mit denen du arbeitest

              dann baue ich mal ne hashmap zum umwandeln der ids in richtige int...

              Klingt eher nach Würgaround als solider Programmiertechnik.

              Gruß,
              andiv

              vielen danke! ich brauche tatsächlich die long, sonst fehlt mir eine ordnungsrelation, danke! :)

              1. ne, funktioniert nicht, ich wollte

                arraylist<Long> list = new arraylist();

                long i = ...

                list.get(i)

                ich bau mir einfach ne hashmap mit key long, mal schauen

                1. Hallo,

                  ne, funktioniert nicht, ich wollte

                  "Funktioniert nicht" ist doch keine Fehlerbeschreibung. Wie soll man dir da denn helfen?

                  arraylist<Long> list = new arraylist();

                  long i = ...

                  list.get(i)

                  Wenn schon dann
                  List<Long> list = new ArrayList<Long>();
                  long item = list.get(index);

                  Welche Fehlermeldung wird dir denn gezeigt?

    2. Tach!

      wenn ich die daten die ich haben will einfach in einer txt speichere komme ich vermutlich auf weniger als 200 MB, hierzu möchte ich allerdings noch die suchfunktion einer DB haben...

      IDs als 32-Bit-Integer abgelegt benötigen 4 Byte, wenn kein Oberhead dazukommt. Das ergibt bei 1,57GB Platz für circa 400 Millionen IDs.

      gibt es bestimmte tricks so eine suchfunktion selber zu bauen?

      Natürlich. Allerdings ist das kein Trick sondern altbekanntes Wissen, das ständig verwendet wird. Ein Verfahren nennt sich binäre Suche. Voraussetzung ist, dass die IDs sortiert sind. Dann greift man in die Hälfte, schaut ob sie stimmt. Ist sie kleiner oder größer, nimmt man sich die obere oder untere Hälfte und beginnt von vorn, bis man trifft oder nicht mehr weiter teilen kann. Code dafür solltest du reichlich finden.

      die ids sind integer, allerdings sehr große und ich weiß nicht ob eventuell irgendwann eine sehr kleine id hinzukommt,

      Solange sie als Zahl die magische Grenze von 4.294.967.295 nicht übersteigen, ist alles in Ordnung. Ansonsten kannst du nur die Hälfte ablegen, wenn du 64-Bit-Integers nimmst.

      dedlfix.

  2. Meine Herren,

    MySQL würde mir den Speicher komplett füllen.

    Nur zum besseren Verständnis: Ist der MySQL-Server ansich zu groß, oder wächst die MySQL-Datenbank zu schnell?

    Ich bin kein Fachmann auf dem Gebiet, aber vielleicht ist SQLite eine Option für dich.

    1. Meine Herren,

      MySQL würde mir den Speicher komplett füllen.

      Nur zum besseren Verständnis: Ist der MySQL-Server ansich zu groß, oder wächst die MySQL-Datenbank zu schnell?

      Ich bin kein Fachmann auf dem Gebiet, aber vielleicht ist SQLite eine Option für dich.

      mysql runtergeladen und entpackt -> 1.02 GB groß und das war mir zuviel, weil ich dann nurnoch 300 mb hatte

      ich glaube mysql hat vieles was ich nicht brauche mit drin... oder so, kenne mich mit DB's nicht besonders gut aus

      1. sqlite schaue ich mir  an, danke. und ich muss auch gucken, das ich mit java auf die DB zugreifen kann.

        Meine Herren,

        MySQL würde mir den Speicher komplett füllen.

        Nur zum besseren Verständnis: Ist der MySQL-Server ansich zu groß, oder wächst die MySQL-Datenbank zu schnell?

        Ich bin kein Fachmann auf dem Gebiet, aber vielleicht ist SQLite eine Option für dich.

        mysql runtergeladen und entpackt -> 1.02 GB groß und das war mir zuviel, weil ich dann nurnoch 300 mb hatte

        ich glaube mysql hat vieles was ich nicht brauche mit drin... oder so, kenne mich mit DB's nicht besonders gut aus

        1. Tach!

          sqlite schaue ich mir  an, danke. und ich muss auch gucken, das ich mit java auf die DB zugreifen kann.

          Da SQLite direkt in das Programm eingebunden wird, kannst du mit jedem System darauf zugreifen, für das es eine Implementierung gibt. Java ist mit dabei.

          dedlfix.

          1. hi,

            Tach!

            sqlite schaue ich mir  an, danke. und ich muss auch gucken, das ich mit java auf die DB zugreifen kann.

            Da SQLite direkt in das Programm eingebunden wird, kannst du mit jedem System darauf zugreifen, für das es eine Implementierung gibt. Java ist mit dabei.

            Für gleichzeitigen Zugriff von mehreren Systemen ist SQLite aber mit vorsicht zu genießen bzw. eigentlich schon von abzuraten.

            Gruß Niklas

            --
            Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
            1. Tach!

              Für gleichzeitigen Zugriff von mehreren Systemen ist SQLite aber mit vorsicht zu genießen bzw. eigentlich schon von abzuraten.

              Hast du dazu belastbares Material? Laut der SQLite-Dokumentation ist diesem Problem sehr wohl Rechnung getragen.

              http://www.sqlite.org/lockingv3.html
              "Locking and concurrency control are handled by the pager module. The pager module is responsible for making SQLite "ACID" (Atomic, Consistent, Isolated, and Durable). The pager module makes sure changes happen all at once, that either all changes occur or none of them do, that two or more processes do not try to access the database in incompatible ways at the same time, and that once changes have been written they persist until explicitly deleted."

              dedlfix.

        2. Hallo,

          sqlite schaue ich mir  an, danke. und ich muss auch gucken, das ich mit java auf die DB zugreifen kann.

          diese Information hättest du mal früher liefern sollen. Für Java gibt es eine ganze Reihe sogenannter "embedded databases". Z.B. Derby, HSQLDB, H2, ...

          Ich persönlich kann H2 empfehlen, klein, schnell und leicht zu verwenden.

          Gruß,
          andiv