Wątek przeniesiony 2022-11-18 15:12 z Hardware/Software przez cerrato.

Nie moge wykonac operacji bo mam za malo pamieci RAM

0

Hej mam napisany kod w C# ktory robi ogromne obliczenia i zapisuje wyniki do pamieci podreczniej. W pewnym momencie uzyci ramu jest 100% i wszystko mi wywala. Czy jest jakis sposob jak to obejsc?

8

Są różne strategie, np.:

  1. Sprawdź kod, może masz wyciek pamięci.
  2. Zmień algorytm obliczeń na mniej zachłanny na pamięć.
  3. Zapisuj dane na dysku, a nie do RAMu (alternatywnie zwiększ rozmiar pliku wymiany)
  4. Dodaj z pół TB RAMu i zobacz czy działa lepiej.
1

@yarel:

+1

@Kokos123:

  1. Algorytm nie naiwny, a poparty jakimś "naukowym podejściem", być może są to dane "przelotowe"
  2. (zw z 3.) @Kokos123 nie ma dobrych rad, jak nie powiesz co to jest. HIPOTETYCZNIE nie używane wektory z jakiejś dupnej macierzy w jakiś szybkich strukturach dyskowych key-value
Kokos123 napisał(a):

Hej mam napisany kod w C#

Zwykle na tym forum oznacza to "zadu..łem przypadkowy kod gdzieś z netu"

0

@yarel:
@ZrobieDobrze:
Kod jest napisany przez programistow w mojej pracy i nie moge w niego ingerowac. Problem polega na tym ze te obliczenia sa z reguly wykonywane na wirtualnych sporych maszynach wiec nie ma tego problemu ktory mam gdy chce uruchomic ten kod na lokalnej maszynie. Czyli rozumiem ze bez ingerowania w kod nic sie nie da zrobic i ogranicza mnie moja maszyna?

0
Kokos123 napisał(a):

@yarel:
@ZrobieDobrze:
Kod jest napisany przez programistow w mojej pracy i nie moge w niego ingerowac. Problem polega na tym ze te obliczenia sa z reguly wykonywane na wirtualnych sporych maszynach wiec nie ma tego problemu ktory mam gdy chce uruchomic ten kod na lokalnej maszynie. Czyli rozumiem ze bez ingerowania w kod nic sie nie da zrobic i ogranicza mnie moja maszyna?

Nic.

1

@Kokos123: W tej sytuacji trudno ocenić czy zapotrzebowanie na RAM wynika z rozmiaru danych wejściowych (możesz próbować uruchamiać na np. 1% danych, o ile ma to sens), czy program ma minimalne zapotrzebowanie na np. 128GB RAM. Najlepiej dopytaj programistów w swojej pracy. Zwiększenie pliku wymiany pewnie umożliwi uruchomienie programu, ale zamiast działać 1h, będzie działał 10 dni. Tu masz randomowy link : https://www.eurogamer.pl/plik-wymiany-stronicowania-co-to-jest-czy-warto-go-wylaczyc-pcg

3
yarel napisał(a):
  1. Dodaj z pół TB RAMu i zobacz czy działa lepiej.
  1. NIE kupować programistom 0.5 TB RAM ;)
0

Najpierw spróbuj zoptymalizować program i nie chodzi tu wyłącznie o algorytm, lecz także o model przechowywania danych. Na przykład jeżeli masz dużą tablicę zawierającą tylko wartości z przedziału 0-3 to można je spakować po cztery w jednym bajcie (lub po 8 w słowie, albo po 16 w podwójnym słowie). Pogorszy to szybkość działania, jednak zmniejszy kilkukrotnie wymaganą pamięć. Język C ma obsługę takiego pakowania wbudowaną (tzw. pola bitowe), C# prawdopodobnie nie ma, jednak zaprogramowanie jej ręcznie nie powinno być znowuż jakieś wyjątkowo trudne. Gdy mimo wszystko zabraknie miejsca, zapisuj dane na dysku, także na dyskach zewnętrznych jak pendrive. Ważne jest jednak przemyślane wykorzystanie tej przestrzeni (gdyż odwołania na dysk są wolniejsze niż do pamięci) - choćby stosowanie cache pamięciowego.

1
Manna5 napisał(a):

Język C ma obsługę takiego pakowania wbudowaną (tzw. pola bitowe), C# prawdopodobnie nie ma, jednak zaprogramowanie jej ręcznie nie powinno być znowuż jakieś wyjątkowo trudne.

Idekser, który jest "tablicową" wersją property.

Rzecz w tym, że
a) kol nie może / nie chce modyfikować
b) utajnił, jakiej natury to obliczenia. Prawdę mówiąc nawet to, że to tablice, co jest w zasadzie oczywiste, ale konkretnie to się domyślamy.
c) czy to tablica typów prostych int / float / double, czy złożonych, nic nie wiemy

2
Manna5 napisał(a):

Najpierw spróbuj zoptymalizować program i nie chodzi tu wyłącznie o algorytm, lecz także o model przechowywania danych [...]

Szanowny Panie, kłania się umiejętność czytania ze zrozumieniem :P
Parę postów wyżej @Kokos123 przecież napisał Kod jest napisany przez programistów w mojej pracy i nie moge w niego ingerowac.

0

Spróbuj mocno zwiększyć pamięć wirtualną. Tak czy owak to rozwiązanie zawsze zadziała, pytaniem jest jak bardzo spowolni twój kod. Jeśli kod używa ramu w zły sposób (np. trzyma pamięć, która nie jest póżniej używana) to taki zabieg może sprawić, że wydajność nie spadnie w żaden sposób.

0

AFAIR Qemu potrafi emulować RAM z wykorzystaniem dysku - jeśli masz ekstra wolne miejsce, możesz poczytać jak to zrobić i spróbować; prawdopodobnie będzie to jednak dosyć wolne.

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