große Strings/Dateien in EditorGadget laden

Hier könnt ihr alle Fragen zu SpiderBasic austauschen.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35
Computerausstattung: armseliger Laptop, mit wenig RAM und noch weniger CPU-Leistung. ...und die Grafikkarte.... ....naja.. da male ich doch lieber selber.
Wohnort: nahe Wolfsburg

Re: große Strings/Dateien in EditorGadget laden

Beitrag von SBond »

Klar :mrgreen: ...wenn es dir nicht zu viel Arbeit macht :wink:

Das Laden von großen Dateien erfolgt explizit durch den Nutzer und da dies nur im lokalen Netzwerk geschieht, ist es auch nicht ganz so tragisch mit der Größe. Das Laden der Datei, Parsen und Konvertieren schaffe ich bei den Datenmengen (20 MB) in weniger als einer Sekunde. So kann ich die Werte z.B. plotten. StringField ist aber extrem langsam (würde Minuten dauern), daher mache ich es etwas anders.

Ja das anschauen aller Eintäge wird ein Benutzer nur selten geschehen, aber z.B. bei Logdateien könnte es interessant werden. Da habe ich auch Exemplare die >60MB sind.

Das EditorGadget ist allgemein nicht dazu geeignet große Datenmengen darzustellen. Meine Überlegung war es nun, nur Ausschnitte der Datei im Editor darzustellen, je nach dem, wo sich z.B. der Scrollbalken befindet. ..so eine Art Seek-Funktion, die ab einen bestimmten Offset der String-Variable (in der sich der komplette Inhalt der Datei befindet) eine bestimmte Anzahl an Zeilen in den Editor lädt. ....quasi wie es z.B. ein Hex-Editor machen würde.

Bei PureBasic gibt es soweit ich weiß APIs, aber die gehen bei SpiderBasic nun nicht. ...mal sehen ob ich das irgendwie gelöst bekomme....
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: große Strings/Dateien in EditorGadget laden

Beitrag von Kiffi »

SBond hat geschrieben:Klar :mrgreen: ...wenn es dir nicht zu viel Arbeit macht :wink:
die Herausforderung in diesem Fall war es, das dem ListIconGadget zugrunde liegende dGrid verwenden zu wollen, damit keine externen JavaScript-Libraries geladen werden müssen.

Das Laden und Darstellen der Daten geschieht meines Erachtens nun in akzeptablen Geschwindigkeiten, wobei ein Löwenanteil für die Aufbereitung der Daten verbraten wird. Vielleicht kann ein JS-Profi hier noch an der Tuning-Schraube drehen.

Demo mit Spiel-Daten: [Edit: Den Link gibt's auf Anfrage per PN]

Code:

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window_Main
  #Gadget_Grid
EndEnumeration

Global T1

Procedure BlockUI(Message.s)
  ! $.blockUI({ message: v_message });
EndProcedure

Procedure UnblockUI()
  ! $.unblockUI();
EndProcedure

Procedure BindGridToGadget(Gadget, GridColumns, GridData)
  
  ! var selector = $(spider_GadgetID(v_gadget).div).find('.dijitContentPane');
  
  ! var grid = new spider.DGridOnDemandGrid({
  !   collection: v_griddata,
  !   columns: v_gridcolumns
  ! }, selector[0]);
  
  ! selector.data("grid", grid);
  
  ! grid.startup();
  
EndProcedure

! function csvToArray (csv) {
!    var rows = csv.split("\n");
!    return rows.map(function (row) {
!      return row.split("\t");
!    });
! };
! window.csvToArray = csvToArray;

Procedure HTTPRequestCallback(Success, Result.s)
  
  If Success
    
    Debug "Daten geladen in: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
    T1 = ElapsedMilliseconds()
    
    ! var array = csvToArray(v_result);
    
    Debug "Csv -> Array: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
    T1 = ElapsedMilliseconds()
    
    ! var records = [];
    
    ! $.each(array, function(rowCounter, row) {
    !   if (rowCounter == 0) {
    !   } else {
    !     var record = {};
    !     record.id = rowCounter;
    !     $.each(row, function(columnCounter, column) {
    !       record['col' + columnCounter.toString()] = column;
    !     });
    !     records.push(record);
    !   }
    ! });
    
    Protected Store
    
    ! v_store = new spider.DStoreMemory( {data : records, idProperty: 'id'} );
    
    Debug "Daten -> Store: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
    Protected Columns 
    
    ! v_columns = {
    !   col0: 'Time [s]',
    !   col1: 'Offset [ms]',
    !   col2: 'Delay [ms]',
    !   col3: 'Dispersion [ms]',
    !   col4: 'Poll [Log2s]'
    ! };
    
    OpenWindow(#Window_Main, 0, 0, 600, 500, "dGrid", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ContainerGadget(#Gadget_Grid, 10, 10, 580, 480) : CloseGadgetList()
    
    T1 = ElapsedMilliseconds()
    
    BindGridToGadget(#Gadget_Grid, Columns, Store)
    
    Debug "Store -> Gadget: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
  Else
    Debug "!HTTPRequest()"
  EndIf

  UnblockUI()
  
EndProcedure

BlockUI("<h1>20 MB Daten werden geladen...</h1>")

T1 = ElapsedMilliseconds()

HTTPRequest(#PB_HTTP_Get, "resources/bigdata.csv", "", @HTTPRequestCallback())
Schau es Dir mal an. Wenn Du Fragen hast: Melden!

Grüße ... Peter
Zuletzt geändert von Kiffi am 26.06.2017 09:25, insgesamt 1-mal geändert.
Hygge
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35
Computerausstattung: armseliger Laptop, mit wenig RAM und noch weniger CPU-Leistung. ...und die Grafikkarte.... ....naja.. da male ich doch lieber selber.
Wohnort: nahe Wolfsburg

Re: große Strings/Dateien in EditorGadget laden

Beitrag von SBond »

wow :mrgreen:

auf sowas wäre ich wohl nicht so schnell gekommen.
Habe tatsächlich noch 2 Fragen an dich: Was genau macht dieses "!" am Anfang der Zeile? Ermöglicht es einfach HTML/JavaScript oder ähnliches zu nutzen?

.. und in dieser Zeiel:

Code: Alles auswählen

! var array = csvToArray(v_result);
Wie wird hier v_result an Result.s gebunden? Wenn ich die Variablen umbennene geht es nicht mehr.


auf jeden Fall nochmals vielen Dank <)

Gruß,
Martin
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: große Strings/Dateien in EditorGadget laden

Beitrag von Kiffi »

SBond hat geschrieben:Was genau macht dieses "!" am Anfang der Zeile? Ermöglicht es einfach HTML/JavaScript oder ähnliches zu nutzen?
es leitet eine Inline JavaScript - Zeile ein:
http://www.spiderbasic.com/documentatio ... nedjs.html

Grüße ... Peter
Hygge
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35
Computerausstattung: armseliger Laptop, mit wenig RAM und noch weniger CPU-Leistung. ...und die Grafikkarte.... ....naja.. da male ich doch lieber selber.
Wohnort: nahe Wolfsburg

Re: große Strings/Dateien in EditorGadget laden

Beitrag von SBond »

oh :oops:

das habe ich wohl geschickt übersehen. Vielen Dank <)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Antworten