sql >> Database >  >> NoSQL >> MongoDB

Een JSON-bestand opslaan met GridFs

Het is zeer waarschijnlijk niet de moeite waard om de gegevens in Mongo op te slaan met GridFS.

Binaire gegevens horen nooit echt thuis in een database, maar als de gegevens klein zijn, wegen de voordelen van het in de database plaatsen (opvragen) op tegen de nadelen (serverbelasting, traag).

In dit geval lijkt het erop dat u documentgegevens (JSON) in GridFS wilt opslaan. U kunt dit doen en het opslaan zoals u andere binaire gegevens zou opslaan. De gegevens zullen echter ondoorzichtig zijn. U kunt geen JSON-gegevens opvragen die zijn opgeslagen in een GridFS-document, alleen de metagegevens van het bestand.

Big data opvragen

Zoals u zei dat u de gegevens wilde opvragen, moet u het formaat van uw gegevens controleren. Als uw gegevens de indeling hebben die in het voorbeeld wordt vermeld, lijkt het alsof er geen ingewikkelde zoekopdrachten nodig zijn, alleen stringovereenkomsten. Er zijn dus verschillende opties.

Geval 1:veel data, weinig punten

Als u niet veel datasets heeft (paren van field1 en field2 ) maar de gegevens voor elk zijn groot (field2 bevat veel bytes), sla deze ergens anders op en sla alleen een verwijzing daarnaar op. Een eenvoudige oplossing zou zijn om de gegevens op te slaan (voorheen field2 ) in een tekstbestand op Amazon S3 en sla de link op. bijv.

{
  field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
  field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}

Geval 2:kleine gegevens, veel punten

Als je elke dataset klein is (minder dan 16 MB), maar er zijn veel datasets, sla je data dan op in MongoDB (zonder GridFS).

Specificaties

In jouw geval zijn de gegevens vrij groot en is het af te raden om ze op te slaan met GridFS.

Dit antwoord biedt een benchmark naar beneden. De benchmark lijkt erop te wijzen dat de ophaaltijd min of meer recht evenredig is met de bestandsgrootte. Met dezelfde setup zou het 80 seconden duren om een ​​document uit de database op te halen.

Mogelijke optimalisaties

De standaard chunk-grootte in GridFS is 255 KiB. U kunt de toegangstijden voor grote bestanden mogelijk verkorten door de chunk-grootte te vergroten tot het maximum (16 MB). Als de chunk-grootte het enige knelpunt is, zou het gebruik van de chunk-grootte van 16 MB de ophaaltijd verkorten van 80 seconden naar 1,3 seconden (80 / (16 MB/255KiB) =1,3). U kunt dit doen bij het initialiseren van de GridFS-bucket.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

Een betere strategie zou zijn om de enige bestandsnaam in Mongo op te slaan en in plaats daarvan het bestand uit het bestandssysteem op te halen.

Andere nadelen

Een ander mogelijk nadeel van het opslaan van binaire gegevens in Mongo komt van deze site :"Als de binaire gegevens groot zijn, kan het laden van de binaire gegevens in het geheugen ertoe leiden dat vaak gebruikte tekstdocumenten (gestructureerde gegevens) uit het geheugen worden geduwd, of meer in het algemeen, de werkset past mogelijk niet in het RAM. Dit kan een negatieve invloed hebben de prestaties van de database." [1 ]

Voorbeeld

Een bestand opslaan in GridFS, aangepast van de Mongo GridFS-tutorial

const uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, (error, db) => {
  const bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./fasta-data.json')
    .pipe(bucket.openUploadStream('fasta-data.json'))
    .on('finish', () => console.log('done!'))
  ;
});


  1. Is het queryresultaat van Mongoose alleen-lezen?

  2. redis-prestaties, sla json-object op als een tekenreeks

  3. Aangepaste foutmeldingen met Mongoose

  4. MongoCollection versus DBCollection java