Sempervivum
Erfahrenes Mitglied
Mal eine Frage an die Datenbankspezialisten:
Ich lese Daten aus einer SQLite3-Datenbank in Javascript aus und zeige sie mit HTML an. Die Datenbank enthält Bilder als Blobs. 400 Datensätze und die Datei ist 80MB groß. IMHO nicht besonders viel in der Datenbankwelt.
Erster simpler Ansatz:
Es handelt sich um eine App für Android, die man Dank Capacitor mit Javascript entwickeln kann. Geniale Sache, als Webentwickler kann man Apps entwickeln ohne allzu viel neu lernen zu müssen.
Leider stürzt mein Handy bei dieser Operation ab. Ich vermute, es hat zu wenig Arbeitsspeicher. Issue bei Github:
Crashes when querying all records from a database containing images (blobs) · Issue #439 · capacitor-community/sqlite
Ich konnte einen Workaround bauen, indem ich zunächst alle Datensätze ohne Bilder auslese und dann Bild-für-Bild die Bilder. Funktioniert so weit dann ohne Absturz, nur ziemlich langsam.
1. Maßnahme: Ich spreche die Bilder über den Namen an, also einen Index über diese Spalte angelegt. Brachte keine nennenswerte Verbesserung.
2. Maßnahme: Ich fand heraus, dass es eine rowid gibt, also die Bilder darüber angesprochen. Ebenfalls keine nennenswerte Verbesserung.
3. Maßnahme: Vielleicht braucht das Rendern des HTML bei jedem Datensatz nennenswert Zeit? Also nur alle 10 Datensätze das HTML im DOM hinzu gefügt. Leider auch keine nennenswerte Verbesserung.
Der Code:
Jetzt vermute ich, dass einfach die Verarbeitung der Blobs mit den Bildern seine Zeit braucht. Oder gibt es noch andere Möglichkeiten, das zu optimieren?
Beste Grüße, Ulrich
Ich lese Daten aus einer SQLite3-Datenbank in Javascript aus und zeige sie mit HTML an. Die Datenbank enthält Bilder als Blobs. 400 Datensätze und die Datei ist 80MB groß. IMHO nicht besonders viel in der Datenbankwelt.
Erster simpler Ansatz:
Code:
select Bild, Name, Art, Beschreibung from `Substanzen - Substanzen`
Leider stürzt mein Handy bei dieser Operation ab. Ich vermute, es hat zu wenig Arbeitsspeicher. Issue bei Github:
Crashes when querying all records from a database containing images (blobs) · Issue #439 · capacitor-community/sqlite
Ich konnte einen Workaround bauen, indem ich zunächst alle Datensätze ohne Bilder auslese und dann Bild-für-Bild die Bilder. Funktioniert so weit dann ohne Absturz, nur ziemlich langsam.
1. Maßnahme: Ich spreche die Bilder über den Namen an, also einen Index über diese Spalte angelegt. Brachte keine nennenswerte Verbesserung.
2. Maßnahme: Ich fand heraus, dass es eine rowid gibt, also die Bilder darüber angesprochen. Ebenfalls keine nennenswerte Verbesserung.
3. Maßnahme: Vielleicht braucht das Rendern des HTML bei jedem Datensatz nennenswert Zeit? Also nur alle 10 Datensätze das HTML im DOM hinzu gefügt. Leider auch keine nennenswerte Verbesserung.
Der Code:
Code:
conn = new exports.SQLiteConnection(exports.CapacitorSQLite);
console.log(conn);
conn.createConnection(
"Substances", false, "no-encryption", 3, false
).then(db => {
console.log(db);
db.open("Substances", false, 'no-encryption', 3, true).then(() => {
document.getElementById('feedback').innerHTML = `Texte werden aus Datenbank gelesen ...`;
const sql = "select rowid, Name, Art, Beschreibung from `Substanzen - Substanzen`";
db.query(sql).then(result => {
console.log(result);
document.querySelector('section.substances').innerHTML = '';
let nr = 0, htmlTotal = '';
const nrRows = result.values.length;
result.values.forEach(row => {
console.log(row.Name + ' - ' + row.Art);
const sqlImg = "select Bild from `Substanzen - Substanzen` where rowid='" + row.rowid + "'";
let srcImg = '';
db.query(sqlImg).then(result => {
if (result.values[0]) {
const img = result.values[0].Bild;
if (img) {
console.log((typeof new Blob([new Uint8Array(img).buffer])))
srcImg = URL.createObjectURL(new Blob([new Uint8Array(img).buffer]));
}
}
// HTML aus Template lesen und die Platzhalter ersetzen
let html = document.getElementById('substance-tpl').innerHTML
.replace(/{{name}}/g, row.Name)
.replace(/{{art}}/g, row.Art)
.replace(/{{beschreibung}}/g, row.Beschreibung)
.replace(/{{img}}/g, srcImg);
htmlTotal += html;
nr++;
document.getElementById('feedback').innerHTML = `Datensatz ${nr} von ${nrRows} wurde gelesen`;
if (nr % 10 == 0 || nr == nrRows) {
// HTML in section mit den Substanzen am Ende eintragen
document.querySelector('section.substances')
.insertAdjacentHTML('beforeend', htmlTotal);
htmlTotal = '';
}
});
});
// db.close("Substances");
return 'database read successfully';
});
});
});
Beste Grüße, Ulrich