Thread View: pl.comp.os.linux.programowanie
7 messages
7 total messages
Started by Borneq
Sat, 16 Aug 2014 19:13
Mapowanie pliku fizycznego do pamięci
Author: Borneq
Date: Sat, 16 Aug 2014 19:13
Date: Sat, 16 Aug 2014 19:13
21 lines
1889 bytes
1889 bytes
Znalazłem http://stackoverflow.com/questions/8391094/equivalent-win-api-in-nix gdzie opisane jest open(2) / creat(2) shm_open mmap open jako parametr ma łańcuch 8-bitowych znaków. Czy jest jakaś wersja 16-bitowych lub działa to dla UTF8, lub też w Linuksie nie stosuje się nazw plików Unicode? Teraz shm_open. W przykładzie jest tworzenie nazwy symbolicznej dla obszaru pamięci, która będzie wymieniana między procesami. To przydatne, ale teraz bardziej mi chodzi o mapowanie fizycznego pliku aby się po nim szybko poruszać. Na przykład coś wyszukać od zadanego adresu, nie wiadomo od razu w jakim obszarze, gdy drugi raz wczytywałbym ze strumienia do bufora, to kłopot na granicy między jednym blokiem a drugim. Trzeba by użyć bardzo dużego bufora, ale aby uniknąć wczytywania wszystkiego do bufora lepiej zamapować. Czy jest taka możliwość? Czy plik może mieć adresowanie 64 bitowe i czy jest jak w Windows możliwość wybrania 32 bitowego obszaru wewnątrz pliku z pewnym wyrównaniem? W Windows 8 jest wyrównanie do 64 KiB
Re: Mapowanie pliku fizycznego do pamięci
Author: Borneq
Date: Sat, 16 Aug 2014 19:30
Date: Sat, 16 Aug 2014 19:30
8 lines
1253 bytes
1253 bytes
W dniu 2014-08-16 o 21:13, Borneq pisze: > Znalazłem > open(2) / creat(2) > open jako parametr ma łańcuch 8-bitowych znaków. Czy jest jakaś wersja Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o pozycję, a jeżeli chodzi o open()?
Re: Mapowanie pliku fizycznego do pamięci
Author: Adam Osuchowski
Date: Sat, 16 Aug 2014 20:03
Date: Sat, 16 Aug 2014 20:03
31 lines
2678 bytes
2678 bytes
Borneq wrote: > open jako parametr ma łańcuch 8-bitowych znaków. Czy jest jakaś wersja > 16-bitowych lub działa to dla UTF8, lub też w Linuksie nie stosuje się nazw > plików Unicode? Dla kernela linuksowego na poziomie systemu plików nie ma znaczenia kodowanie znaków. Nazwa pliku jest po prostu ciągiem 8-bitowych bajtów, przy czym żaden z nich nie może być równy 0x2f (separator katalogów w ścieżce) i 0x00 (znacznik końca łańcucha). To jakie znaki odpowiadają poszczególnym bajtom lub sekwencjom bajtów leży w gestii userspaceowej aplikacji (zazwyczaj i tak nie ma to dla niej większego znaczenia) i samego użytkownika. > Teraz shm_open. W przykładzie jest tworzenie nazwy symbolicznej dla obszaru > pamięci, która będzie wymieniana między procesami. To przydatne, ale teraz > bardziej mi chodzi o mapowanie fizycznego pliku aby się po nim szybko > poruszać. > Na przykład coś wyszukać od zadanego adresu, nie wiadomo od razu w jakim > obszarze, gdy drugi raz wczytywałbym ze strumienia do bufora, to kłopot na > granicy między jednym blokiem a drugim. Trzeba by użyć bardzo dużego > bufora, ale aby uniknąć wczytywania wszystkiego do bufora lepiej zamapować. > Czy jest taka możliwość? Czy plik może mieć adresowanie 64 bitowe i czy > jest jak w Windows możliwość wybrania 32 bitowego obszaru wewnątrz pliku z > pewnym wyrównaniem? W Windows 8 jest wyrównanie do 64 KiB Chyba nie bardzo rozumiem jaki masz problem i o co chodzi z tym dużym buforem. Mógłbyś to opisać jaśniej? mmap() mapuje obszar pliku (w szczególności cały plik) w pamięci pod zadanym przez użytkownika lub ustalonym automatycznie przez system adresem. Na systemie 64-bitowym ten adres będzie oczywiście 64-bitowy. Wyrównanie jest realizowane do granicy strony pamięci, czyli na x86 i x86-64 do 4 KiB.
Re: Mapowanie pliku fizycznego do pamięci
Author: Adam Osuchowski
Date: Sat, 16 Aug 2014 20:04
Date: Sat, 16 Aug 2014 20:04
8 lines
1125 bytes
1125 bytes
Borneq wrote: > Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen > działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o > pozycję, a jeżeli chodzi o open()? fstat() http://pubs.opengroup.org/onlinepubs/9699919799/functions/fstat.html
Re: Mapowanie pliku fizycznego do pamięci
Author: Borneq
Date: Sun, 17 Aug 2014 06:41
Date: Sun, 17 Aug 2014 06:41
29 lines
2585 bytes
2585 bytes
W dniu 2014-08-16 o 22:03, Adam Osuchowski pisze: > Chyba nie bardzo rozumiem jaki masz problem i o co chodzi z tym dużym > buforem. Mógłbyś to opisać jaśniej? Właśnie robię komponent do podglądu wielkich plików, które nie będą ładowane w całości do pamięci. Na przykład pliki do kilkugigowe dumpy w postaci XML. Robię to z użyciem biblioteki FLTK więc przenośnie Linux<>Windows Pierwsze podejście było strumeniowe z użyciem plików i seek. Gdy poruszam suwakiem, wybieram pozycję w pliku np. 50% pliku, 100% czyli koniec. Gdy mam jakąś pozycję, w obsłudze PAINT muszę cofnąć się do początku linii, czasem też o kilka, nawet 40 linii gdy wyświetlam koniec pliku. Przeważnie do wyświetlania 40 linii po 100 znaków wystarcza bufor 4 kilo do którego ładuję, jednak co gdy linie będą dłuższe? Drugi raz ładować mam ze strumienia do bufora i jeszcze raz? Co gdy na granicy części ładowanych będzie windowsowy znak podziału linii 13,10? Chyba że od razu będę używał bufora gdzie zmieści się 40 najdłuższych linii, ale mogą być bardzo długie (np. plik może być binarny) > mmap() mapuje obszar pliku (w szczególności cały plik) w pamięci pod > zadanym przez użytkownika lub ustalonym automatycznie przez system adresem. A jak go uzyć? Jako parametr ma uchwyt otwarty przez open()? http://man7.org/linux/man-pages/man2/mmap.2.html void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); addr może być NULL?, lengh to 32 bitowa wartość, prot to PROT_READ? offset to 64 bitowy początek mapowania w pliku?
Re: Mapowanie pliku fizycznego do pamięci
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Sun, 17 Aug 2014 17:48
Date: Sun, 17 Aug 2014 17:48
13 lines
1533 bytes
1533 bytes
Adam Osuchowski pisze: > Borneq wrote: >> Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen >> działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o >> pozycję, a jeżeli chodzi o open()? > > fstat() skoro dla fopen() robisz fseek(,,SEEK_END) + seekpos=ftell(), to analogicznie dla open() robisz seekpos=lseek(,0,SEEK_END), lub wspomniany powyżej fstat(), a jeśli dysponujesz nazwą to również stat()/lstat() (przy czym lstat niedostępne na platformach win32)
Re: Mapowanie pliku fizycznego do pamięci
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Sun, 17 Aug 2014 17:48
Date: Sun, 17 Aug 2014 17:48
13 lines
1494 bytes
1494 bytes
Adam Osuchowski pisze: > Borneq wrote: >> Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen >> działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o >> pozycję, a jeżeli chodzi o open()? > > fstat() skoro dla fopen() robisz fseek(,,SEEK_END) + seekpos=ftell(), to analogicznie dla open() robisz seekpos=lseek(,0,SEEK_END), lub wspomniany powyżej fstat(), a jeśli dysponujesz nazwą to również stat()/lstat() (przy czym lstat niedostępne na platformach win32)
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads