Nowe posty

Autor Wątek: Podzielenie pliku na mniejsze części  (Przeczytany 2784 razy)

netas

  • Gość
Podzielenie pliku na mniejsze części
« dnia: 2011-12-03, 08:02:40 »
Witam wszystkich.

Mój problem polega na podzieleniu pliku na kilka/kilkanaście mniejszych plików, dlaczego ?

Z bazy danych MS SQL przez bulk copy wyrzucam sporą ilość danych do pliku, ok 50 milionów rekordów następnie przerzucam to przez FTP-a na inny komputer i tam robię import do MySQL-a funkcją LOAD DATA INFILE. Problem w tym że danych jest już tak dużo ze ta funkcja już sobie nie radzi. Podejrzewam że on czytając plik do importu tworzy dla każdego rekordu zapytanie SQL wiec zaczyna mu szybko brakować pamięci więc wykorzystuje do tego plik wymiany przez co trwa to strasznie długo.

Pomyślałem że podzielę ten plik za pomocą PHP, lecz niestety plik jest za duży aby zaalokować tyle pamięci (ustawiłem w php.ini 2GB i było mało). Jedyny sposób jaki widzę to wykorzystać do tego BASH aby to on podzielił plik na kilka mniejszych, problem w tym ze z BASHem niewiele miałem do czynienia więc prośba do kolegów z forum o pomoc.

Aktualnie plik ma ok 550MB (ok 50milionów rekordów) i są w nim dane zapisane w takiej postaci:

3602     23966      48.0000 B        3
3604     23966      48.0000 B        3
3632     23966      48.0000 B        2
3622     23666      48.0000 B        3
3605     23366      48.0000 B        1
3607     23965      48.0000 B        3
3612     23956      48.0000 B        3

Dla osoby która BASHem włada jak językiem ojczystym to 5 min roboty.
Chodzi mi o to aby podzielić plik na kilka/kilkanaście w którym będzie powiedzmy 1 milion rekordów, plik wtedy będzie miał ok 25MB i funkcja LOAD DATA INFILE sobie z tym poradzi bez problemu.
W PHP bym sobie to zrobił ale bash-a niestety nie znam.
Z góry dziękuję za cenne wskazówki.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3071
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Podzielenie pliku na mniejsze części
« Odpowiedź #1 dnia: 2011-12-03, 11:01:34 »
man split
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

  • Gość
Podzielenie pliku na mniejsze części
« Odpowiedź #2 dnia: 2011-12-03, 11:04:39 »
Możesz użyć head do odczytania pierwszych X linii.
Możesz użyć tail do odczytania ostatnich X linii.
Możesz użyć sed/awk do odczytania linii z dowolnego zakresu.
Możesz użyć split, który z przełącznikiem -l powinien zrobić dokładnie to, czego chcesz.

netas

  • Gość
Podzielenie pliku na mniejsze części
« Odpowiedź #3 dnia: 2011-12-03, 21:13:44 »
dziękuję za wskazówkę, już pięknie działa, pomógł split -l