Как я обнаруживаю, какой вид JRE установлен — 32 бита по сравнению с 64 битами

Во-первых, мы должны понять, как должен выглядеть идеальный словарь для фрейма данных.

Фрейм данных можно представить двумя разными способами:
Один - это традиционный набор строк.

'row 0':  ['jack', 100, 50, 'A'],
'row 1':  ['mick', 107, 62, 'B']

Тем не менее, есть второе представление, которое более полезно, хотя, возможно, не так интуитивно на первый взгляд.
Коллекция столбцов:

'name': ['jack', 'mick'],
'height': ['100', '107'],
'weight': ['50', '62'],
'grade': ['A', 'B']

Теперь, вот ключевая вещь, которую нужно осознать, 2-е представление более полезно, потому что это представление поддерживается и используется во фреймах данных. ]
Он не сталкивается с конфликтом типов данных в пределах одной группировки (каждый столбец должен иметь 1 фиксированный тип данных) Однако в представлении строки типы данных могут различаться.
Кроме того, операции могут выполняться легко и согласованно для всего столбца из-за этой согласованности, которую нельзя гарантировать подряд.

Итак, tl; dr DataFrames по сути являются коллекциями столбцов одинаковой длины.

Таким образом, словарь в этом представлении может быть легко преобразован в DataFrame.

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries

row_names = ["jack", "mick"]

data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries

Итак, имея в виду, первое, что нужно понять, это то, что в своем текущем формате data очень плохое представление. Это набор строк, объединенных в один список.

Первое, что нужно сделать, если вы сами контролируете, как формируются данные, - это не подготовить их таким образом.

Цель - список для каждого столбца, и в идеале, подготовить список в этом формате.

Однако теперь, если он задан в этом формате, вам нужно выполнить итерацию и собрать значения соответствующим образом. Вот способ сделать это

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries
row_names = ["jack", "mick"]
data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries

dic = {key:[] for key in column_names}
dic['name'] = row_names
print(dic)

Вывод на данный момент:

{'height': [],
 'weight': [],
 'grade': [],
 'name': ['jack', 'mick']} #so, now, names are a column representation with all correct values.

remaining_cols = column_names[1:]

#Explanations for the following part given at the end
data_it = iter(data)
for row in zip(*([data_it] * len(remaining_cols))):
    for i, val in enumerate(row):
        dic[remaining_cols[i]].append(val)

print(dic)

Вывод:

{'name': ['jack', 'mick'],
 'height': [100, 107],
 'weight': [50, 62],
 'grade': ['A', 'B']}

И мы закончили с представлением

[ 1135] Наконец:

import pd
df = pd.DataFrame(dic, columns = column_names)
print(df)
   name  height  weight grade
0  jack     100      50     A
1  mick     107      62     B

Редактировать: Некоторое объяснение части почтового индекса: zip берет любые итерации и позволяет нам проходить через них вместе.

data_it = iter(data) #prepares an iterator. 

[data_it] * len(remaining_cols) #creates references to the same iterator

Здесь это похоже на [data_it, data_it, data_it]

* в *[data_it, data_it, data_it] позволяет нам вместо этого распаковать список в 3 аргумента для функции zip, поэтому f(*[data_it, data_it, data_it]) эквивалентно на f(data_it, data_it, data_it) для любой функции е.

магия здесь в том, что прохождение через итератор / продвижение итератора теперь будет отражать изменения во всех ссылках

Собрав все это вместе: zip(*([data_it] * len(remaining_cols))) фактически позволит нам взять 3 элемента из данных за один раз. время, и присвоить его строке Итак, row = (100, 50, 'A') в первой итерации zip

for i, val in enumerate(row): #just iterate through the row, keeping index too using enumerate
    dic[remaining_cols[i]].append(val) #use indexes to access the correct list in the dictionary

Надеюсь, что помогает.

49
задан Eddie 30 April 2009 в 03:46
поделиться

5 ответов

В системе могут быть доступны как 32-битные, так и 64-битные JVM, и их множество.

Если у вас уже есть dll для каждой поддерживаемой платформы - рассмотрите возможность создания небольшого исполняемого файла, который связывает и запустить, чтобы вы могли проверить, поддерживает ли платформа определенную функциональность. Если исполняемый файл связывается и запускается, вы можете установить соответствующие общие библиотеки.

0
ответ дан 7 November 2019 в 11:54
поделиться

В linux мой (java) vm сообщает java.vm.name = Java HotSpot (TM) 64-битная виртуальная машина сервера. Javadocs для System объявляет, что System.getProperty всегда будет иметь значение для этого, но ничего не говорит о sun.arch.data.model.

К сожалению, они не указывают, каким будет системное свойство, поэтому другая JVM может просто сообщить java.vm.name = Edgar.

Кстати, под «установленным в системе» я предполагаю, что вы имеете в виду «текущую работающую JVM»?

0
ответ дан 7 November 2019 в 11:54
поделиться

Используемую архитектуру JVM можно получить с помощью свойства " os.arch ":

System.getProperty("os.arch");

Часть «os», кажется, немного ошибочна, или, возможно, дизайнеры оригинала не ожидали, что JVM будут работать на архитектурах, для которых они не были написаны. Возвращаемые значения кажутся несовместимыми .

Команда установщика NetBeans решает проблему JVM против архитектуры ОС. Цитата:

x64 бит: Java и система

Отслеживается как Выпуск 143434 .

В настоящее время мы используем x64 бит JVM для определить, если система (и, следовательно, Platform.getHardwareArch ()) является 64-разрядным или не. Это определенно неправильно, так как можно запустить 32-битную JVM на 64-битная система. Мы должны найти Решение для проверки ОС на реальную 64-битность в случае запуска на 32-разрядной JVM.

  • для Windows это можно сделать с помощью WindowsRegistry.IsWow64Process ()
  • для Linux - путем проверки 'uname -m / -p' == x86_64
  • для Solaris it. может быть сделано, например, с помощью 'isainfo -b'
  • для Mac OSX, это не может быть сделано с помощью аргументов uname, возможно, это может быть решается созданием 64-битного двоичного файла и выполнение на платформе ... (к сожалению, это не работает :( Я создал двоичный файл только с x86_64 и арка ppc64, и это было успешно выполняется на Tiger ..)
  • для поддержки универсального Unix - это также не ясно ... скорее всего, проверка для того же 'uname -m / -p' / 'getconf LONG_BIT 'и сравнивая его с некоторыми возможные 64-битные значения (x86_64, x64, amd64, ia64).

Примеры свойств различных JVM, работающих на 64-битной Ubuntu 8.0.4:

32-битная IBM 1.5:

java.vendor=IBM Corporation
java.vendor.url=http://www.ibm.com/
java.version=1.5.0
java.vm.info=J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20061001 (JIT enabled)
J9VM - 20060915_08260_lHdSMR
JIT  - 20060908_1811_r8
GC   - 20060906_AA
java.vm.name=IBM J9 VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=IBM Corporation
java.vm.version=2.3
os.arch=x86
os.name=Linux
os.version=2.6.24-23-generic
sun.arch.data.model=32

64-битная Sun 1.6:

java.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi
java.version=1.6.0_05
java.vm.info=mixed mode
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=Sun Microsystems Inc.
java.vm.version=10.0-b19
os.arch=amd64
os.name=Linux
os.version=2.6.24-23-generic
sun.arch.data.model=64

64-битная GNU 1.5:

java.vendor=Free Software Foundation, Inc.
java.vendor.url=http://gcc.gnu.org/java/
java.version=1.5.0
java.vm.info=GNU libgcj 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
java.vm.name=GNU libgcj
java.vm.specification.name=Java(tm) Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=Free Software Foundation, Inc.
java.vm.version=4.2.4 (Ubuntu 4.2.4-1ubuntu3)
os.arch=x86_64
os.name=Linux
os.version=2.6.24-23-generic

(версия GNU не сообщает о свойстве "sun.arch.data.model"; предположительно, другие JVM тоже этого не делают.)

48
ответ дан 7 November 2019 в 11:54
поделиться

Следующий код проверяет поле machineType в любом исполняемом файле Windows на определить, является ли он 32 или 64 битным:

public class ExeDetect
{
  public static void main(String[] args) throws Exception {
    File x64 = new File("C:/Program Files/Java/jre1.6.0_04/bin/java.exe");
    File x86 = new File("C:/Program Files (x86)/Java/jre1.6.0/bin/java.exe");
    System.out.println(is64Bit(x64));
    System.out.println(is64Bit(x86));
  }

  public static boolean is64Bit(File exe) throws IOException {
    InputStream is = new FileInputStream(exe);
    int magic = is.read() | is.read() << 8;
    if(magic != 0x5A4D) 
        throw new IOException("Invalid Exe");
    for(int i = 0; i < 58; i++) is.read(); // skip until pe offset
    int address = is.read() | is.read() << 8 | 
         is.read() << 16 | is.read() << 24;
    for(int i = 0; i < address - 60; i++) is.read(); // skip until pe header+4
    int machineType = is.read() | is.read() << 8;
    return machineType == 0x8664;
  }
}

Обратите внимание, что код был сжат для краткости ...

-5
ответ дан 7 November 2019 в 11:54
поделиться
import sun.misc.*;

import java.lang.reflect.*;

public class UnsafeTest {
  public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
    unsafeField.setAccessible(true);
    Unsafe unsafe = (Unsafe) unsafeField.get(null);
    System.out.println(unsafe.addressSize());
  }
}
1
ответ дан 7 November 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: