Fråga:
Databas för lagring av stora datamängder från webbskrapning
Surabhil Sergy
2014-03-07 10:25:27 UTC
view on stackexchange narkive permalink

Jag utformar ett skrapsystem som skrapar stora datamängder från webbplatser. Systemet förväntas samla in data från webbplatser och lagra det i databasen.

Jag lagrar strukturerad data som analyseras från HTML-taggar.

Till exempel: Om det är att skrapa en hotelllista, data skulle innehålla hotell-id, hotellnamn, plats, pris, recensioner, betyg, URL, etc.

Denna databas förväntas ha över 20-50 miljoner poster. Datauppsättningen kan innehålla information på olika språk. Uppgifterna kommer att fyllas i regelbundet (mer eller mindre en miljon varje vecka).

Databasen måste optimeras för filtrering och sökning. Det borde också kunna hantera de andra språktecknen (till exempel kinesiska). Jag behöver snabbt körning och hämtning av data tillsammans med karaktärsstöd.

Jag funderade på att använda MySQL, men jag vet inte om det finns några bättre alternativ. Om MySQL är det bästa alternativet, vilken lagringsmotor, sortering och teckenuppsättning ska användas?

Redigerad

Jag har en DB-plan för att lagra data för varje vecka lagra i separata tabeller, som senare kan kombineras (om det behövs) enligt kraven.

Ger kinesiska tecken några problem när du GÅR med i frågorna?

Lagrar den data i flera tabeller skapar alla prestandaproblem under hämtning. (Jag planerade flera tabeller eftersom en indexerad stor tabell kunde göra insättningen av data långsammare)

MySQL är ett dåligt val vad gäller dataintegritet. PostgreSQL kan vara praktiskt nog för dig.
20 miljoner poster är ingenting för någon anständig modern databas; och de stöder alla unicode i dessa dagar. Problemet är inte vilken databas du ska använda, utan hur man identifierar, skrapar (som inkluderar kodsidekonverteringar till unicode) och strukturerar dina data - och därefter hur man effektivt extraherar information från databasen.
vad sägs om att använda ett NoSQL-tillvägagångssätt i det här fallet. Jag har bara erfarenhet av MySQL och jag har hört mycket om databaser som mongo db. Kommer att använda detta kan göra en väsentlig förbättring av prestandan.?
mysql passar bra för din uppgift. om du väljer att gå med ett alternativ riskerar du frustrationen av en inlärningskurva, vilket skulle försena ditt projekt. Beroende på vilken teknik du väljer att extrahera och visa dessa resultat måste du också se till att tekniken är kompatibel för att använda den.
@JoshuaAnderson OK tack. Jag använder PHP för att skrapa data och med PDO-förlängningen överensstämmer det med stora DB: s. Tidigare när jag bearbetade en DB med cirka 1 miljon poster med MySQl hade jag mött olika begränsningar som frågor som tog mer tid och därmed tog bort timeoutproblem. Jag är i en förvirring med MySQL när jag hanterar en så stor databas.
kolla in den här tråden: [klicka mig] (http://stackoverflow.com/questions/1276/how-big-can-a-mysql-database-get-before-performance-starts-to-degrade)
@JanDoggen // Ditt problem är inte vilken databas som ska användas, utan hur man identifierar, skrapar (som inkluderar kodsidekonverteringar till unicode) och strukturerar dina data - och därefter hur man effektivt extraherar information från databasen. // Visst är detta en stor begränsning.
Tre svar:
skamradt
2014-03-26 04:12:14 UTC
view on stackexchange narkive permalink

Alla moderna databassystem med unicode-stöd kommer att kunna hantera detta enkelt, prestationsvinster kommer att göras i optimeringen av index och ett korrekt databasschema. Att dela upp saker i flera tabeller / databaser med hjälp av naturliga kluster hjälper också till med prestanda.

Det handlar inte bara om responstid som begär data utan också uppdatering. För en massbelastning av flera objekt tyckte jag generellt sett att det var mycket bättre att inaktivera indexering tills laddningen är klar, sedan indexera igen ... och ännu bättre att gå till mindre undertabeller med logiska kluster.

Prova svårast att undvika att använda strängar / varchar / guidvärden som en nyckel i ett index. Använd en int eller int64. Jag vet att uuid är "statistiskt unika" och verkar som en bra sak att använda för ett unikt ID ... men kollisioner händer, och du måste vara beredd på dem och kostnaden för att kontrollera en. Om du behöver indexera på något vanligt är det bättre att placera det vanliga i en separat tabell och länka till posten med hjälp av ett heltal främmande nyckel och indexera det främmande nyckelfältet.

Här i mitt fall kunde jag inte hitta något heltal som skulle användas som primär nyckel. Det finns en enda parameter som kan behandlas som unik och det är en sid-URL.
Använd sedan en hashalgoritm för att reducera strängen till ett ganska unikt heltal. Du kommer att få några kollisioner, men indexet kommer att hitta matchningar MYCKET snabbare än strängjämförelserna, då måste du gå igenom resultatuppsättningen och leta efter en exakt matchning.
Studiosi
2014-03-26 19:48:18 UTC
view on stackexchange narkive permalink

Varför inte en NOSQL-databas?

Jag tror att det kan finnas bättre svarstider på en dokumentbaserad no-sql-databas som MongoDB. Det gör det möjligt att fritt forma (tänk dig att det finns hotell som till exempel inte har alla fält du letar efter). Dokumenten och replikering är väldigt enkelt, vilket ger ett integritetslager, eftersom det är möjligt att ha replikuppsättningar i olika servrar som är transparenta för programmeraren.

Sagt, du måste vara riktigt försiktig med datastrukturen, eftersom det inte finns några strukturkontroller eller PK eller FK.

Alla bör också läsa detta: http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/
Basil Bourque
2017-07-27 11:08:31 UTC
view on stackexchange narkive permalink

Postgres JSONB

Om du skrapar olika typer av data från olika källor för att lagras tillsammans men tillräckligt varierande eller ändras tillräckligt ofta för att du inte vill definiera specifika tabeller för varje källa, och de strukturerade uppgifterna du får är tillräckligt enkla för att representeras som JSON, då föreslår jag att du överväger Postgres.

De senaste versionerna av Postgres har en ny inbyggd datatyp som heter JSONB, där B betyder binär. När du skickar in ett JSON-värde analyserar Postgres det i de olika fälten och lagrar dessa delar på ett intelligent sätt i ett internt definierat binärt format. Denna process ger Postgres möjlighet att indexera JSON-fälten. Det betyder onda snabba prestanda som kan överträffa olika “NO-SQL” -system. Och till skillnad från de andra systemen får du ACID -kompatibel tillförlitlighet och dataintegritet med Postgres.

Denna JSONB-typ ersätter PostSgres ursprungliga JSON-stöd liksom dess äldre HSTORE-typ.

För mer information, se:

Kinesisk text

Postgres kan hantera kinesisk text, med fullt stöd av Unicode. Var noga med att skapa databasen / katalogen för att specificera UTF-8 -kodning.

Naturligtvis måste databasdrivrutinen och klientappen också stödja UTF- 8.

Datavolym

Postgres kan enkelt hantera tiotals miljoner rader och infogar eller uppdaterar en miljon i veckan.

Om du laddar många rader samtidigt, titta på alternativ till att ringa INSERT en rad i taget, till exempel kommandot COPY .

Postgres är som standard konfigurerad för att inte påverka värdmaskinen negativt. Om du vet att du har ytterligare minne och CPU tillgängligt kan du utforska de olika Postgres-inställningarna.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...