2010-10-14 11 views
7

Utworzony przeze mnie program python jest związany z IO. Większość czasu (ponad 90%) spędza się w pojedynczej pętli, która powtarza się ~ 10 000 razy. W tej pętli generowane są ~ 100KB dane i zapisywane do pliku tymczasowego; jest następnie odczytywany z powrotem przez inny program i statystyki dotyczące zebranych danych. Jest to jedyny sposób przekazania danych do drugiego programu.RAMdisk wolniejszy od dysku?

Z uwagi na to, że jest to główne wąskie gardło, pomyślałem, że przeniesienie lokalizacji pliku tymczasowego z mojego głównego dysku twardego na (~ 40 MB) RAMdysku (wewnątrz ponad 2 GB wolnej pamięci RAM) znacznie zwiększyłoby prędkość IO w tym zakresie plik, a więc zmniejszyć czas działania. Jednakże, to otrzymuje się następujące wyniki (w każdym z uśrednieniem 20 przebiegów):

  • danych Test 1: Bez RAMDisk - 72.7s, Z RAMDisk - 78.6s
  • danych Test 2: bez RAMDisk - 223.0s, z RAMdisk - 235.1s

Wygląda na to, że RAMdisk jest wolniejszy niż mój HDD.

Co może być przyczyną?

Czy istnieje jakaś alternatywa dla użycia RAMdysku, aby uzyskać szybszy plik IO?

Odpowiedz

3

Twój system operacyjny prawie na pewno buforuje/buforuje zapisywanie dysku. Nic dziwnego, że dysk RAM jest tak blisko wydajności.

Nie wiedząc dokładnie, co piszesz i w jaki sposób, możemy zaoferować tylko ogólne sugestie. Kilka pomysłów:

  • Jeśli masz 2 GB pamięci RAM, prawdopodobnie masz przyzwoity procesor, więc można napisać te dane do systemu plików, który ma kompresji. To wymieniłoby operacje we/wy dla czasu procesora, zakładając, że twoje dane są do tego przystosowane.

  • Jeśli robisz wiele małych pism, połącz je, aby pisać większe kawałki na raz. (Czy widzimy kod źródłowy?)

  • Czy usuwasz plik 100 KB po użyciu? Jeśli go nie potrzebujesz, usuń go. W przeciwnym razie system operacyjny może zostać zmuszony do wypłukania go na dysk.

2

Czy można zapisać dane w partiach, a nie po jednym produkcie na raz? Czy buforujesz zasoby, takie jak otwarte uchwyty plików itp. Czy czyścisz je? Czy twój dysk zapisuje blokowanie, czy możesz użyć wątków tła do nasycenia IO, nie wpływając na wydajność obliczeń.

Najpierw popatrzę na optymalizację zapisu dysku, a następnie na szybsze dyski.

+0

Chodzi o to, że używa teraz czystej pamięci RAM - w ogóle nie jest to dysk. Zgodnie z wszelkimi oczekiwaniami powinien uzyskać lepszą wydajność, niż dałoby to najszybsze dyski SSD na rynku - ale jest wolniejszy niż napęd mechaniczny. Pyta, dlaczego tak może być. – Arafangion

+0

Tak, doceniam to. Sugerowałem, że może to nie dysk, a sposób w jaki dyski są używane, jest problemem. –

+1

Arafangion: Pomysł, że "RAM = electronic, disk = mechanical" nie jest już tak naprawdę prawdziwy. Twój system operacyjny może kopiować strony pamięci na dysk, gdy zajdzie taka potrzeba (RAM -> mechaniczne) lub pliki pamięci podręcznej w pamięci, jeśli chce (dysk -> elektroniczny). Brudne strony (kod, dane lub pliki) są przepłukiwane do mechanicznego talerza tylko wtedy, gdy potrzebuje pamięci RAM. – Ken

2

Wiem, że system Windows jest bardzo agresywny w buforowaniu danych dyskowych w pamięci RAM, a 100K zmieści się z łatwością. Napisy przechodzą bezpośrednio do pamięci podręcznej, a następnie być może zapisywane na dysku poprzez zapis nieblokujący, który pozwala na kontynuowanie programu. Prawdopodobnie dysk RAM nie obsługiwałby operacji nieblokujących, ponieważ oczekuje, że operacje te będą szybkie i nie warto tego robić.

Ograniczając ilość pamięci dostępnej dla programów i pamięci podręcznej, zwiększysz ilość operacji we/wy dysku, nawet jeśli tylko nieznacznie.

To wszystko spekulacja z mojej strony, ponieważ nie znam jądra ani sterowników.Spekuluję również, że Linux będzie działał podobnie.

0

Miałem to samo zdumiewające doświadczenie i po wielu próbach odkryłem to. Kiedy ramdysk jest sformatowany jako FAT32, nawet jeśli testy porównawcze pokazują wysokie wartości, rzeczywiste użycie jest wolniejsze niż dysków SSD sformatowanych w systemie plików NTFS. Ale ramdysk sformatowany w NTFS jest szybszy w rzeczywistości niż dysk SSD.

0

W moich testach stwierdziłem, że nie tylko wielkość partii wpływa na ogólną wydajność, ale także charakter samych danych. Udało mi się uzyskać 5 razy lepsze czasy zapisu w porównaniu do SSD tylko w jednym scenariuszu: napisanie 100-bitowego kawałka wstępnie ugotowanej tablicy bajtów na dysk RAM. Zapisywanie bardziej "przewidywalnych" danych, takich jak litery "aaa" lub aktualny czas istnienia, daje całkiem odwrotne wyniki - SSD jest zawsze szybszy lub równy. Zgaduję więc, że system operacyjny (Win 7 w moim przypadku) robi wiele buforowania i optymalizacji. Wygląda na to, że najbardziej przeszkadzającym przypadkiem dla RAM-drive jest wykonywanie wielu małych zapisów zamiast kilku dużych, a dysk RAM będzie świecił podczas zapisywania dużych ilości trudnych do skompresowania danych.

Powiązane problemy