php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.06.2005, 21:35  
Neuer Benutzer
 
Registriert seit: 21.02.2005
Beiträge: 26
msdose
Standard richtig großes csv importieren

also ich steh vor folgendem problem:


ich muss mehrere csv Dateien (alle ca. 500 MB groß) in eine SQL-Tabelle importieren.


dabei muss ich aber noch einiges am CSV ändern, z.b. Spalten zusammenfassen, einige brauche ich auch gar nicht.

ich hab mir zuerst ein php-script geschrieben, dass allerdings trotz ausgeschaltetem time und memory limit so ungefähr bei der 10.000 Zeile aufgibt

gibt es da andere möglichkeiten (mysql, evtl c-programm oder andere cgi's)
root-zugriff auf dem server habe ich.

schonmal danke für konstruktive hilfe

achja und wenn ihr wissen wollt, wtf in 500mb csv's steht: Firmengeheimnis
msdose ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.06.2005, 21:36  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

?? ist glaub ich der schnellste weg :P
http://dev.mysql.com/doc/mysql/en/load-data.html
robo47 ist offline   Mit Zitat antworten
Alt 01.06.2005, 22:31  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

Was heißt denn "aufgeben"?
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Alt 02.06.2005, 06:17  
Neuer Benutzer
 
Registriert seit: 21.02.2005
Beiträge: 26
msdose
Standard

@robo: thx, brauch ich bloß erstmal file rechte in mysql. Aber die Methode sieht auf jeden fall richtig vielversprechend aus.

@marsch: aufgeben bedeutet, dass sich das script einfach aufhängt und nicht weitere Daten aus der CSV importiert. Ob das jetzt allerdings am CSV-Import oder an den SQL-INSERTS liegt weiß ich nicht. Allerdings find ich ein php-script was mehrere Stunden läuft sowieso recht unpassend, dafür ist php halt einfach nicht ausgelegt.
msdose ist offline   Mit Zitat antworten
Alt 02.06.2005, 08:14  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

Zitat:
Zitat von msdose
aufgeben bedeutet, dass sich das script einfach aufhängt und nicht weitere Daten aus der CSV importiert.
aha... wie sieht das Script denn aus? Wenn ich immer nur eine Zeile lese, konvertiere und dann das INSERT draus bastele, ist es mir relativ egal, ob es eine, 100 oder 100000 Zeilen sind. Wie stellst Du fest, dass es sich "aufgehängt" hat?
Zitat:
Zitat von msdose
Ob das jetzt allerdings am CSV-Import oder an den SQL-INSERTS liegt weiß ich nicht.
Ja, das ist auch die Info, die mich in diesem Moment interessieren würde.
Zitat:
Zitat von msdose
Allerdings find ich ein php-script was mehrere Stunden läuft sowieso recht unpassend, dafür ist php halt einfach nicht ausgelegt.
Sagt wer? Und wieso für 500MB mehrere Stunden? Das sollte Minutensache sein, csv aus Excel exportiert mit max 65535 Zeilen... oder rechne ich falsch oder wird aus Access exportiert? Egal.
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Alt 02.06.2005, 08:25  
Neuer Benutzer
 
Registriert seit: 21.02.2005
Beiträge: 26
msdose
Standard

nein ich lese die daten aus einer csv auf dem server aus.

das script importiert ungefähr 1000 Zeilen je Sekunde, also bei 3,6Millionen zeilen sind das dann 1 Stunde.

Aufhängen merke ich daran, dass das script (trotz beständigem flush()) nichts ausgibt und in die sql-db auch nichts eingefügt wird.

Ich kann ja mal die relevanten Stellen des Scripts hier posten, allerdings muss ich erstmal zur uni
msdose ist offline   Mit Zitat antworten
Alt 02.06.2005, 08:52  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

Zitat:
Zitat von msdose
nein ich lese die daten aus einer csv auf dem server aus.
Na das dachte ich mir schon
Zitat:
Zitat von msdose
das script importiert ungefähr 1000 Zeilen je Sekunde, also bei 3,6Millionen zeilen sind das dann 1 Stunde.
Na das passt doch, kannste nebenbei gemütlich 1 oder 2 Kaffee trinken.
Zitat:
Zitat von msdose
Aufhängen merke ich daran, dass das script (trotz beständigem flush()) nichts ausgibt und in die sql-db auch nichts eingefügt wird.
Machst Du eigentlich nach jedem INSERT ein COMMIT? Wie sieht der Plattenplatz auf dem DB-Server aus? Welcher Tabellentyp (ist InnoDB vielleicht voll)? Fehlermeldungen eingebaut? Ich glaube nicht an ein "Aufhängen"
Zitat:
Zitat von msdose
Ich kann ja mal die relevanten Stellen des Scripts hier posten,...
JAAAAAAA
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Alt 02.06.2005, 12:03  
Neuer Benutzer
 
Registriert seit: 21.02.2005
Beiträge: 26
msdose
Standard

PHP-Code:
<?php


function importCsv($importFile)
    {

        
$drt = new drt;

        
        
$i=0//counts number of imported datasets

        
$import = new csv;


        
$import->setInput($importFile);


    while(
$import->nextLine())
        {
            
        
$data = array();

            
$data $import->getLine();

            
//hier wird der query-string $q aus dem array $data zusammengewerkelt
            //darf ich aber nicht zeigen :)

            
$this->db->query($q);

             
$i++;

              
$j=$i%1000;

              if(
$j==0//alle tausend addressen kommt eine ausgabe
              
{
                
$drtTimes $drt->getDRT();
            foreach ( 
$drtTimes as $mark => $time )
            {
                     
$time .= $mark.' '.$time.' seconds';
            }

        echo 
$i.'. Datensatz - '.$data[2].';'.$data[1].';'.$data[4].';'.$data[5].';'.$data[9].';'.$data[10].';+49 '.$data[12].' '.$data[13].'
Zeit: '
.$time.'
'
;
    }
                
    
flush();

        }

        
$echo $i.' datasets imported
'
;

        
$drtTimes $drt->getDRT();
        foreach ( 
$drtTimes as $mark => $time )
        {
            
$echo .= $mark.' '.$time.' seconds
'
;
        }

        echo 
$echo;
}


?>

so die fkt verwendet die php-lib klasse für die querys (die würde auch meckern, falls was beim sql-query schief geht), eine klasse drt für die duration times und eine klasse csv für die CSV's (weiß nicht woher ich die genau habe, die funktionen dürften aber selbsterklärend sein).

Speicher und Zeitlimit stelle ich logischerweise vor funktionsaufruf aus.


btw: Ich mache keinen Commit, ich hab noch nie was davon gehört, genauso wie InnoDb!?
*googlngeh*

Plattenplatz ist mehr als genug da (so ca. 16 GB, erweiterbar)
msdose ist offline   Mit Zitat antworten
Alt 02.06.2005, 14:27  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

So, nu kenne ich die csv-Klasse nicht
Wie behandelt die eine CSV-Datei? Liest die zeilenweise, oder hat die alles im Speicher?
Hast Du es schon mal mit einer kleineren Datei versucht? So etwas mehr als 2000 Zeilen? Führe es doch mal in einer Shell aus, nicht im Browser. Und dann kläre doch mal, welchen Tabellentyp die betroffenen Tabellen haben und ob die Datenbank-Klasse mit Transaktionen arbeitet.
Wieviele Ausgaben macht
Code:
foreach ( $drtTimes as $mark => $time ) {
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Alt 02.06.2005, 16:14  
Neuer Benutzer
 
Registriert seit: 21.02.2005
Beiträge: 26
msdose
Standard

die csv klasse liest die daten zeilenweise mit fgetcsv aus

mittlere Dateien (100 000 Zeile) funktionieren.

Zitat:
Wieviele Ausgaben macht
Code:
PHP-Code:
foreach ( $drtTimes as $mark => $time ) { 
Zwei

Die Tabelle ist eine Standart - MyISAM. Es ist einfach nur eine standart-mäßig mit phpmyAdmin erzeugte Tabelle.

Die Datenbank-Klasse verwaltet im Prinzip nur die verbindung zum mysql-server und führt die querys aus.


die Tabellenklasse (falls das was hilft)
PHP-Code:
<?

/************************************************

mysql connection class

************************************************/






class mydb {

    
// public parameters
    
var $host '';
    var 
$database '';
    var 
$user '';
    var 
$password '';

    
// private parameters
    
var $link_id 0;
    var 
$query_id 0;

    var 
$record   = array();
    var 
$row;

    var 
$error '';
    var 
$errno 0;






    
// private: connect to mysql database
    
function connect($Database ''$Host ''$User ''$Password '') {

        if ( 
'' == $host ) { $host $this->host; }
        if ( 
'' == $database ) { $database $this->database; }
        if ( 
'' == $user ) { $user $this->user; }
        if ( 
'' == $password ) { $password $this->password; }

        
$this->link_id mysql_connect$host,$user,$password);
        if ( !
$this->link_id ) {
            
$this->halt('connect('.$host.', '.$user.', '."\$password".') failed.');
        }

        if ( !@
mysql_select_db($database,$this->link_id) ) {
            
$this->halt('cannot use database '.$this->database);
        }

        return 
$this->link_id;

    }



    
// private: free previous result
    
function free_result() {
        @
mysql_free_result($this->query_id);
        
$this->query_id 0;
    }



    
// private: print error message
    
function halt($msg) {

        
$this->error = @mysql_error($this->link_id);
        
$this->errno = @mysql_errno($this->link_id);

        echo(
'[b]Database Error:[/b] '.$msg.'
'
);
        echo(
'[b]MySQL Error:[/b] '.$this->errno.' ('.$this->error.')
'
);
        die(
'Session halted.');

    }











    
// public: perform a query
    
function query($query_string) {

        if ( !
$this->connect() ) {
            return 
0;
        }

        
// new query will discard previous result.
        
if ( $this->query_id ) {
            
$this->free_result();
        }

        
$this->query_id = @mysql_query($query_string,$this->link_id);
        
$this->row 0;

        if ( !
$this->query_id ) {
            
$this->halt('Invalid SQL: '.$query_string);
        }

        return 
$this->query_id;

    }






    
// public: walk result set
    
function next_record() {

        if ( !
$this->query_id ) {
            
$this->halt('next_record called without query.');
            return 
0;
        }

        
$this->record = @mysql_fetch_array($this->query_id);
        
$this->row   += 1;
        
$this->errno  mysql_errno();
        
$this->error  mysql_error();

        
$status is_array($this->record);
        if ( !
$status ) {
            
$this->free_result();
        }

        return 
$status;

    }



    
// public: evaluate the result (size, width)
    
function affected_rows() {
        return 
mysql_affected_rows($this->link_id);
    }

    function 
num_rows() {
        return @
mysql_num_rows($this->query_id);
    }

    function 
num_fields() {
        return @
mysql_num_fields($this->query_id);
    }

    function 
f($name) {
        return 
$this->record[$name];
    }




    
// public list table names
    
function table_names() {

        
$this->query('SHOW TABLES');
        
$i=0;
        while ( 
$info mysql_fetch_row($this->query_id) ) {
            
$return[$i]['table_name'] = $info[0];
            
$return[$i]['tablespace_name'] = $this->database;
            
$return[$i]['database'] = $this->database;
            
$i++;
        }

        return 
$return;

    }

}




?>
msdose ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP richtig lernen! TeazY PHP Tipps 2008 5 01.02.2008 21:50
Auflistung erfolgt nicht richtig phyton Datenbanken 4 06.02.2007 17:22
importieren meiner sql Datenbank matthros Datenbanken 14 19.05.2006 12:42
[Erledigt] Modularisierung: Wie macht man es richtig? PHP-Fortgeschrittene 1 12.03.2006 16:00
Wie fängt man richtig an und wie geht es weiter? PHP Tipps 2007 5 27.11.2005 16:00
[Erledigt] Lieg ich da richtig? Datenbanken 4 31.08.2005 13:21
[Erledigt] VARIABLEN WERDEN NICHT RICHTIG VERARBEITET!!!! HILFE PHP Tipps 2005-2 6 02.07.2005 18:32
PHP funktioniert nicht richtig?! PHP Tipps 2005-2 26 11.06.2005 09:05
Variable wird nicht richtig übergeben PHP Tipps 2005 17 16.01.2005 16:51
[Erledigt] MySQL ODBC - Word 97 - Daten importieren Datenbanken 0 30.11.2004 10:44
[Erledigt] imap_body RICHTIG ausgeben (mit allen Sonderzeichen usw.) PHP-Fortgeschrittene 3 08.09.2004 02:33
[Erledigt] Perl richtig installiert oder falsch ? testen aber wie ? c01001 Server, Hosting und Workstations 2 31.08.2004 22:37
Formular, welches prüft, ob eingegebene Antwort richtig.... PHP Tipps 2004 10 15.08.2004 22:18
Zeit wird nicht richtig angezeigt ... PHP Tipps 2004 8 18.07.2004 16:14
Access importieren Datenbanken 4 07.06.2004 21:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
csv spelten zusammenfügen php, php class csv import, php grosse csv dateien importieren time limit, csv import sql, perl mehrere csv einlesen, programm großes csv, csv zu groß für import php, access dateimport 100000 zeilen, 1 gb csv importieren php, php scripte zusammenführen in csv, csv zend import, 4 gb große csv einlesen und in datenbank php, csv import php klasse, csv import php gros, csv importieren innodb, php insert über 1000 zeilen, php csv importieren, ändern und exportieren, große csv datei memory limit, tausende daten zeilen in sql datenbank importieren csv, php liest csv ohne zeilen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.