Toon posts:

[MySQL]Importeren van grote CSV datafeeds

Pagina: 1
Acties:
  • 199 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Momenteel ben ik bezig met het maken van een website die informatie (met dagelijkse en wekelijkse updates) van verschillende feeds (CSV feeds) in een database moet importeren.
Opzich lukt dat allemaal aardig, totdat het feeds van ca. 40MB betreft die timeouts van mijn php import scripts veroorzaken.

Deze grote csv's bevatten boven de 150.000 rijen informatie en ik denk dat het niet praktisch is om deze regel voor regel in de database te zetten. Ik ben op onderzoek gegaan en heb gevonden dat het ook snel kan met de mysql functie LOAD DATA INFILE. Ik wil deze functionaliteit opzich wel gaan gebruiken maar ik kom er niet uit hoe ik die externe feeds (dus van andere servers) daarmee kan inladen. Tot nu toe is het mij alleen gelukt om csv bestanden die op de server zelf staan, te importeren.
Alle import scripts moeten automatische werken (cronjobs) dus ik dacht dat het misschien mogelijk is eerst de betreffende feeds te downloaden naar de server (ook allemaal automatische via php?) en daarna in te voeren met LOAD DATA INFILE. Kan iemand mij hierbij helpen? hoe pak ik dit probleem het beste aan?

Alvast bedankt!!!

  • spone
  • Registratie: Mei 2002
  • Niet online
Probeer anders eens het script bigdump :)

Bedenk overigens dat het ook mogelijk is om gewoon php vanaf de command line te runnen via een ssh/cmd shell. Dan draait het gewoon als een programma ipv een time-limited script :)

[ Voor 85% gewijzigd door spone op 05-02-2007 17:48 ]

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


Verwijderd

Topicstarter
spone schreef op maandag 05 februari 2007 @ 17:46:
Probeer anders eens het script bigdump :)

Bedenk overigens dat het ook mogelijk is om gewoon php vanaf de command line te runnen via een ssh/cmd shell. Dan draait het gewoon als een programma ipv een time-limited script :)
Met php via command line heb ik geen ervaring.. Werkt dat ook naar een webserver?
Het is belangrijk dat de updates automatisch plaatsvinden dus ik denk dat het command line idee in ieder geval niet van toepassing is. Ook bigdump is niet geschikt want ik kan geen csv bestanden importeren.

Is er een manier om via php grote externe bestanden naar de webserver te downloaden zonder last te krijgen van een timeout?

  • EnigmA-X
  • Registratie: Februari 2002
  • Laatst online: 25-11 16:07

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op maandag 05 februari 2007 @ 17:44:
Deze grote csv's bevatten boven de 150.000 rijen informatie en ik denk dat het niet praktisch is om deze regel voor regel in de database te zetten.
Het is niet òf alles ineens, òf rij voor rij. Om af en toe nog eens wat feedback over de voortgang te krijgen zou je er bijvoorbeeld voor kunnen kiezen om het bijvoorbeeld per 10.000 rijen te doen.

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

Topicstarter
Confusion schreef op maandag 05 februari 2007 @ 21:22:
[...]

Het is niet òf alles ineens, òf rij voor rij. Om af en toe nog eens wat feedback over de voortgang te krijgen zou je er bijvoorbeeld voor kunnen kiezen om het bijvoorbeeld per 10.000 rijen te doen.
Ik heb zelf geen controle over de omvang van de feeds.
Is er dan een manier om de pointer locatie van een extern bestand op te geven (zoals met fseek dat helaas niet werkt met http of ftp resources)? Als ik bijvoorbeeld per 10.000 rijen kan invoeren zou dat fijn zijn, maar ik weet niet hoe ik bij stap 2 kan aangeven op welke regel het script verder moet gaan... (sorry, weinig ervaring met het gebruiken van externe bestanden).

  • spone
  • Registratie: Mei 2002
  • Niet online
ik raad je eens aan dat bigdump script te bekijken, daar staan de dingen in vermeld die jij wilt, en met een beetje moeite kan je dats cript misschien wel aanpassen dat het een csv bestand leest en verwerkt :)

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op maandag 05 februari 2007 @ 22:20:
Ik heb zelf geen controle over de omvang van de feeds.
Is er dan een manier om de pointer locatie van een extern bestand op te geven (zoals met fseek dat helaas niet werkt met http of ftp resources)? Als ik bijvoorbeeld per 10.000 rijen kan invoeren zou dat fijn zijn, maar ik weet niet hoe ik bij stap 2 kan aangeven op welke regel het script verder moet gaan... (sorry, weinig ervaring met het gebruiken van externe bestanden).
Tjah, in een gelijksoortige situatie lees ik een file van tegen de 1 GB in (dat ge-gzipped geupload wordt, maar zelf eerst downloaden kan natuurlijk ook), dat wordt opgedeeld in files van rond de 100 MB, die dan stuk voor stuk worden geimporteerd. Hierbij wordt alleen geen LOAD DATA INFILE gebruikt, omdat er nog wat voorbewerking op de data moet gebeuren (en alles gebeurt in Python; van PHP weet ik weinig).

(In feite wordt het per rij de database in geknald, wat met prepared statements en zonder commit na iedere insert overigens bepaald niet langzaam is.)

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

Topicstarter
Bedankt voor de antwoorden.
Ik heb er uiteindelijk voor gekozen om de time out in het script in te stellen. Het grootste probleem was dat de feeds tijdens het parsen gedownload moesten worden waardoor de max execution time werd overschreden. Het invoeren van 40mb csv is voor mij geen probleem als deze zich op de server waar het script draait bevind maar dat is niet het geval helaas.
Pagina: 1