Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Available physical memory väärtuse pärimine läbi cmd... märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
arvutisõber
HV veteran
arvutisõber

liitunud: 01.08.2002




sõnum 21.06.2008 16:08:14 Available physical memory väärtuse pärimine läbi cmd... vasta tsitaadiga

Selle saab muidu kätte käsklusega systeminfo, aga probleem selles, et selle käsklus käivitab protsessid, mille töö kestab minu arvutis üle 2 sekundi.
Küsimus siis selline, et kas on ka mõni teine ja kiirem võimalus selle väärtuse pärimiseks?
Või on äkki Windowsil mingi logifail, mis sisaldaks ka seda konkreetset väärtust?

_________________
...
Kommentaarid: 55 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 53
tagasi üles
vaata kasutaja infot saada privaatsõnum
Dogbert
HV Guru
Dogbert

liitunud: 03.05.2004




sõnum 21.06.2008 17:23:47 vasta tsitaadiga

Võibolla on mingi parem variant olemas, aga üks võimalus on küsida vaba mälumahtu wmic (Windows Management Instrumentation Command-line) käest:

wmic memlogical get availablevirtualmemory

Esimesel käivitamisel võtab wmic käivitumine aega, sest seda paigaldatakse süsteemi, edaspidi töötab see kiiresti.
memphysical käsk on samuti olemas, aga ei väljasta kuidagi vaba mälu infot.

wmic memlogical get availablevirtualmemory /VALUE

väljundi kuju on veidi erinev - vaata ise, kumb paremini sobib.

_________________
Tee inimesele lõke ja tal on soe üheks päevaks, pista ta põlema ja tal on soe elu lõpuni. (Terry Pratchett)
e.k spikker: muhk on kumer, lohk on nõgus.
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 32
tagasi üles
vaata kasutaja infot saada privaatsõnum
Andrus Luht
itimees.ee
Andrus Luht

liitunud: 11.06.2002



Autoriseeritud ID-kaardiga

sõnum 21.06.2008 17:36:05 vasta tsitaadiga

Vistaga käib asi nii:

C:\Windows\system32>wmic MEMPHYSICAL LIST BRIEF
MaxCapacity  MemoryDevices  Model  Name
4194304      2                     Physical Memory Array


thumbs_up.gif

_________________
Äriklassi serverilahenduste müük, paigaldus ja haldus. SaaS / PaaS / IaaS lahendused
Kasutatud äriklassi serverite, andmesalvede ja võrguseadmete ost-müük-rent
Tier-3 privaatpilvede, virtuaal- ja virtuaal-privaat-serverite lahendused. 24/7 haldus, monitooring
Kommentaarid: 377 loe/lisa Kasutajad arvavad:  :: 5 :: 1 :: 318
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
arvutisõber
HV veteran
arvutisõber

liitunud: 01.08.2002




sõnum 21.06.2008 18:12:50 vasta tsitaadiga

BReaK da iCE kirjutas:
Vistaga käib asi nii:

C:\Windows\system32>wmic MEMPHYSICAL LIST BRIEF
MaxCapacity  MemoryDevices  Model  Name
4194304      2                     Physical Memory Array


thumbs_up.gif

See peaks olema see väärtus, et palju on emaplaadi max mälu piir (replaceable memory)...

Natuke otsisin nende wmic commandide hulgast, aga paistab, et sealt seda available physical memory väärtust näha ei saa...
Kätte saab aga näiteks järgmised väärtused: AvailableVirtualMemory, TotalPageFileSpace, TotalPhysicalMemory, TotalVirtualMemory

wmic:root\cli>memlogical get /all
AvailableVirtualMemory  Caption                       Description                   Name                        SettingID                   TotalPageFileSpace  TotalPhysicalMemory  TotalVirtualMemory
1807348                 Logical Memory Configuration  Logical Memory Configuration  LogicalMemoryConfiguration  LogicalMemoryConfiguration  2516544             1048048              3564592



Dogbert kirjutas:
Võibolla on mingi parem variant olemas, aga üks võimalus on küsida vaba mälumahtu wmic (Windows Management Instrumentation Command-line) käest:

wmic memlogical get availablevirtualmemory

Esimesel käivitamisel võtab wmic käivitumine aega, sest seda paigaldatakse süsteemi, edaspidi töötab see kiiresti.
memphysical käsk on samuti olemas, aga ei väljasta kuidagi vaba mälu infot.

wmic memlogical get availablevirtualmemory /VALUE

väljundi kuju on veidi erinev - vaata ise, kumb paremini sobib.


Ma siin mõtlen, et mis väärtuse see availablevirtualmemory üldse annab... Et see pole ka sama mis systeminfo -> "Virtual Memory: Available:" väärtus, samuti pole ta sama, mis systeminfo -> "Available Physical Memory". Äkki see available physical memory on lihtsalt osa sellest "memlogical get availablevirtualmemory", kui üldse on icon_rolleyes.gif


Rääkides veel systeminfo-st, siis on võimalik anda selline käsklus nagu systeminfo | find "Available Physical Memory", et siis kuvatakse ainult soovitud rida tulemusest, aga aega läheb ikkagi üle 2 sekundi.

_________________
...
Kommentaarid: 55 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 53
tagasi üles
vaata kasutaja infot saada privaatsõnum
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 22.06.2008 11:01:15 vasta tsitaadiga

Selleks on funktsioon GlobalMemoryStatus(), mis ütleb mitu protsenti mälust on kasutuses, palju on füüsilist mälu kokku/saadaval, palju on paging faile kokku/saadaval, palju on virtuaalset mälu kokku/saadaval. Kõike seda ilma mingite protsesside jooksutamiseta.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
arvutisõber
HV veteran
arvutisõber

liitunud: 01.08.2002




sõnum 22.06.2008 22:44:58 vasta tsitaadiga

maxorator kirjutas:
Selleks on funktsioon GlobalMemoryStatus(), mis ütleb mitu protsenti mälust on kasutuses, palju on füüsilist mälu kokku/saadaval, palju on paging faile kokku/saadaval, palju on virtuaalset mälu kokku/saadaval. Kõike seda ilma mingite protsesside jooksutamiseta.


Tänud!

Ainult probleem on selles, et ma saan sealt järgmised tulemused:

Total physical memory 7583270126696857600
Available physical memory 8387602464404013056


Ükskõik kuidas ma neid ei konverteeriks, on need kaks väärtust väga kahtlaselt suured numbrid (kui võtta ühikuks bitt, siis 8387602464404013056 -> 999880130815.984 MB) icon_confused.gif

_________________
...
Kommentaarid: 55 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 53
tagasi üles
vaata kasutaja infot saada privaatsõnum
JannoT
HV kasutaja
JannoT

liitunud: 23.12.2005




sõnum 22.06.2008 23:06:31 vasta tsitaadiga

Proovi GlobalMemoryStatusEx()
_________________
011010000110100101101110011011100110000101110110011000010110000101110100011011000111010101110011
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
arvutisõber
HV veteran
arvutisõber

liitunud: 01.08.2002




sõnum 22.06.2008 23:17:37 vasta tsitaadiga

JannoT kirjutas:
Proovi GlobalMemoryStatusEx()


Siis tuli tulemuseks:

Total physical memory 0
Available physical memory 0

_________________
...
Kommentaarid: 55 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 53
tagasi üles
vaata kasutaja infot saada privaatsõnum
JannoT
HV kasutaja
JannoT

liitunud: 23.12.2005




sõnum 22.06.2008 23:28:06 vasta tsitaadiga

Null tuleb siis kui mingi viga oli ehk siis ürita teada saada milles viga:
http://msdn.microsoft.com/en-us/library/ms679360(VS.85).aspx

_________________
011010000110100101101110011011100110000101110110011000010110000101110100011011000111010101110011
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 23.06.2008 12:35:12 vasta tsitaadiga

Ei tea milles kirjutad, kuid midagi peaks see kood ütlema ikka.
#define WINVER 0x601
#include <windows.h>

void DisplayNum64(__int64 ullNum){
    char szBuf[256];
    MessageBox(0,_i64toa(ullNum,szBuf,10),"Number",MB_OK);
}

int main(int argc, char *argv[]) {
    MEMORYSTATUSEX memStat={0};
    memStat.dwLength=sizeof(MEMORYSTATUSEX); //seda peab kood kindlasti tegema, muidu funktsioon ei tööta
    GlobalMemoryStatusEx(&memStat);
    DisplayNum64(memStat.ullTotalPhys); //baitides
    DisplayNum64(memStat.ullAvailPhys);
    DisplayNum64(memStat.ullTotalPhys/1048576); //megades
    DisplayNum64(memStat.ullAvailPhys/1048576);
    return 1;
}


Ehk siis mul andis vastuseks:
Baitides:
2145824768 (Total physical)
1403252736 (Available physical)
Megades:
2046 (Total physical)
1338 (Available physical)
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
arvutisõber
HV veteran
arvutisõber

liitunud: 01.08.2002




sõnum 23.06.2008 14:59:34 vasta tsitaadiga

Ma realiseerisin Java JNA abil:


1. fail:

import com.sun.jna.*;

public class Nat
{
   public static void main (String [] args)
   {

      Kernel32 lib = (Kernel32) Native.loadLibrary ("kernel32",
                                                    Kernel32.class);

      Kernel32.MEMORYSTATUSEX mem = new Kernel32.MEMORYSTATUSEX ();
      lib.GlobalMemoryStatus(mem);
     
      System.out.println ("Available physical memory " + mem.dwAvailPhys);
      System.out.println ("Total physical memory "     + mem.dwTotalPhys);
     
   } // End of main
   
} // End of file



2. fail:

import com.sun.jna.*;
import com.sun.jna.win32.*;

public interface Kernel32 extends StdCallLibrary
{
   
   public static class MEMORYSTATUSEX extends Structure
   {
      public long dwLength;
      public long dwMemoryLoad;
      public long dwTotalPhys;
      public long dwAvailPhys;
      public long dwTotalPageFile;
      public long dwAvailPageFile;
      public long dwTotalVirtual;
      public long dwAvailVirtual;
     
   } // end of MEMORYSTATUSEX

   void GlobalMemoryStatus (MEMORYSTATUSEX result);
   
} // End of file



Tulemuseks ikkagi kahtlaselt suured numbrid:

Available physical memory 8387602464404013056
Total physical memory 7671723638128181248


Ja kui panen GlobalMemoryStatus asemele GlobalMemoryStatusEx, siis saan 0-d.
Seda errori pärimise asja pole veel jõudnud eriti vaadata...

_________________
...
Kommentaarid: 55 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 53
tagasi üles
vaata kasutaja infot saada privaatsõnum
i8080
Kreisi kasutaja
i8080

liitunud: 15.03.2002



Autoriseeritud ID-kaardiga

sõnum 23.06.2008 15:58:37 vasta tsitaadiga

sul on seal justkui mess-up. kasutad vist 64bit väärtustega struktuuri(EX) ja 32bit funktsiooni (mitte-EX) korraga.

proovisin just ise su jna koodi ja kui asendasin MEMORYSTATUS struktuuri sees deklaratsioonid long (64bit) to int(32bit) ja funktsioonina kutsusin välja GlobalMemoryStatus(..), siis toimis kõik nii nagu peab.
üldse otsi msdn pealt mis vahe on MEMORYSTATUS ja MEMORYSTATUSEX struktuuridel (hint: ühel on enamus 64bit väärtused, teisel on kõik 32bit).


   public static class MEMORYSTATUS extends Structure
   {
      public int dwLength;
      public int dwMemoryLoad;
      public int dwTotalPhys;
      public int dwAvailPhys;
      public int dwTotalPageFile;
      public int dwAvailPageFile;
      public int dwTotalVirtual;
      public int dwAvailVirtual;
   } // end of MEMORYSTATUS

   public static class MEMORYSTATUSEX extends Structure
   {
      public int dwLength;
      public int dwMemoryLoad;
      public long ullTotalPhys;
      public long ullAvailPhys;
      public long ullTotalPageFile;
      public long ullAvailPageFile;
      public long ullTotalVirtual;
      public long ullAvailVirtual;
      public long ullAvailExtendedVirtual;
   } // end of MEMORYSTATUSEX


http://msdn.microsoft.com/en-us/library/aa366772(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa366770(VS.85).aspx
Kommentaarid: 169 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 151
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
arvutisõber
HV veteran
arvutisõber

liitunud: 01.08.2002




sõnum 23.06.2008 16:17:10 vasta tsitaadiga

Tänud!

Ennem sai proovitud ka mitte-EX struktuuri koos GlobalMemoryStatus(x)-ga, aga nüüd selgus, et lihtsalt long tuli asendada int-ga.

Korrektne variant:


1. fail:

import com.sun.jna.*;

public class Nat
{
   public static void main (String [] args)
   {
      Kernel32 lib = (Kernel32) Native.loadLibrary ("kernel32",
                                                    Kernel32.class);

      Kernel32.MEMORYSTATUS mem = new Kernel32.MEMORYSTATUS ();
      lib.GlobalMemoryStatus(mem);
     
      System.out.println ("Available physical memory " + mem.dwAvailPhys);
      System.out.println ("Total physical memory "     + mem.dwTotalPhys);

   } // End of main
   
} // End of file



2. fail:

import com.sun.jna.*;
import com.sun.jna.win32.*;

public interface Kernel32 extends StdCallLibrary
{
   
   public static class MEMORYSTATUS extends Structure
   {
      public int dwLength;
      public int dwMemoryLoad;
      public int dwTotalPhys;
      public int dwAvailPhys;
      public int dwTotalPageFile;
      public int dwAvailPageFile;
      public int dwTotalVirtual;
      public int dwAvailVirtual;
     
   } // end of MEMORYSTATUS

   void GlobalMemoryStatus (MEMORYSTATUS result);
   
} // End of file



Tulemus:


Available physical memory 544854016
Total physical memory 1073201152

_________________
...
Kommentaarid: 55 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 53
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Available physical memory väärtuse pärimine läbi cmd...
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.