Dzielenie dużego pliku na mniejsze

Odpowiedz Nowy wątek
2018-12-11 13:29
0

Witam społeczność,
Mam dość spory plik (nieco ponad 500MB). Jest to wynik dumpa sql. Postanowiłem napisać sobie prosty programik, żeby go podzielić. Pytanie do Was. Jak to najlepiej zrobić? Jakich funkcji użyć, żeby to było dość sprawnie.


Pozdrawiam
Buster

Pozostało 580 znaków

2018-12-11 13:32
0

W jaki sposób chcesz ten plik podzielić?
Po bajtach, linijkach, zapytaniach?


Pozostało 580 znaków

2018-12-11 13:39
0

Ale chcesz go podzielić fizycznie czy tak żeby po podzieleniu i odpaleniu każdej części można było odtworzyć część danych?


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.

Pozostało 580 znaków

2018-12-11 13:42
0

Przed każdą częścią jest coś na kształt tytułu:

--
-- Jakiś tam tekst
--

I po tym chcę dzielić. Gdyby plik był mniejszy, to beż problemu funkcjami strpos, czy pos itp. Ale boję się, że jak załaduję cały ten plik do zmiennej, to wszystko się wywiesi i tyle. Dlatego pytam.


Pozdrawiam
Buster

Pozostało 580 znaków

2018-12-11 13:55
1

Nie musisz wczytywać całego pliku naraz - możesz (i - jak sam zauważyłeś - powinieneś) działać na blokach po 4 kilobajty na przykład.


edytowany 2x, ostatnio: Patryk27, 2018-12-11 13:55

Pozostało 580 znaków

2018-12-11 14:02
0

Ok. A jak początek fragmentu znajdzie się w jednym bloku, a koniec w drugim?


Pozdrawiam
Buster

Pozostało 580 znaków

2018-12-11 14:03
0

No to wtedy łączysz fragmenty razem ;-)
Musisz tutaj ruszyć głową, aby miało to sens, a nie klepać na pałę.


edytowany 2x, ostatnio: Patryk27, 2018-12-11 14:04

Pozostało 580 znaków

2018-12-11 15:28
1
Buster napisał(a):

Ok. A jak początek fragmentu znajdzie się w jednym bloku, a koniec w drugim?

W podobny sposób zrealizowane jest ładowanie tekstu z pliku do listy typu TStringList w metodzie LoadFromFile. Ze strumienia ładowane są bloki o stałym rozmiarze i dzielone na linie. Z racji różnych terminatorów linii, metoda ładująca potrafi zapobiec błędowi, jeśli sekwencja CRLF będzie podzielona na dwa bloki – CR na końcu jednego bloku i LF na początku kolejnego.

Jeśli masz dostęp do kodu źródłowego to tam szukaj podpowiedzi, a jeśli nie to zawsze możesz pobrać Lazarusa i sprawdzić w jego źródłach. Tam podział wczytywanych bloków jest częsty, bo linie zwykle są krótkie, ale to taki algorytm, jakiego potrzebujesz.

Ładowanie danych w blokach jest co prawda trudniejsze, ale za to efektywne i oszczędne pamięciowo. Jeśli nie dasz sobie z tym rady to zawsze możesz czytać dane ze strumienia bajt po bajcie i w ten sposób szukać wymaganej frazy. Będzie to powolne (choć bez testów trudno powiedzieć jak bardzo), ale przynajmniej łatwiejsze w implementacji.


Edit: choć tak szczerze mówiąc, jeśli potrzebujesz podzielić tylko jeden plik, to równie dobrze możesz skorzystać z jakiegoś gotowego narzędzia. Jakiś lepszy hex-edytor na pewno ma funkcję wyszukiwania danych i wydzielania fragmentów do osobnych plików.


edytowany 4x, ostatnio: furious programming, 2018-12-11 15:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0