Tło: Mam duży 2D tablicę liczb całkowitych, które muszę załadować do pamięci w PHP Apache dla każdego żądania. Chcę, żeby zajmowało to mniej pamięci.Czy można używać krótkich intów (16-bitowych) w PHP?
sklepy PHP INTS w PHP_INT_SIZE
bajtów, która wynosi 32 bitów na większości systemów. Wszystkie liczby całkowite są mniejsze niż 2^16, co oznacza, że mogą być short int (np. W C). Czy mam rację sądząc, że przechowywanie int jako krótkich zajmie połowę RAM?
Idealnie chciałabym móc zrobić:
$s = (short) 1234; // takes up 2 bytes instead of 4
Więcej informacji:
- Tablica zajmuje około 100 MB pamięci RAM i jest generowany przez włączenie 30MB var_export() zrzucić
- Tablica jest napisana w procesie cron. Tylko odczyt musi być pamięć efektywny (i szybki)
- Jedyne operacje muszę zrobić na całkowite porównujemy wszystkie z nich (<,> ===), a następnie przeczytaniu kilku z nich (podobnie jak Floyd-Warshall algorithm)
- Reading każdej wartości z DB jest zbyt powolny, jak istnieje kilka milionów odsłon na życzenie
Niektóre szalone pomysły:
- Korzystając pack()/unpack() ale nadal sklep wartości jako 32 bi t ints kiedy zostały rozpakowane
- przechowywać jako wartości pikseli w obrazie i używają PHP GD library je czytać (będzie to powolny)
- Zastosowanie shmop_read() i mają procesy Apache podziel tablicę
- Memcached może działać, ale nie mam doświadczenia z nim i myślę, że byłoby to wiele razy wolniejsze niż native tablicy PHP
- dowiedzieć się C++ i napisać rozszerzenie PHP
- Przekompiluj PHP (lub HipHop?) użyć 2 bajty na int
- użytkowania Igbinary (użyteczne, ale będzie miał ten sam problem co pakiet())
zdecydowanie używaj funkcji shmop_ * ... poza tym, że mogę tylko myśleć o tym samym, co BarsMonster. –
Czy na pewno nie można używać tabel mysql i pamięci? Być może mógłbyś nawet napisać porównania w formularzu zapytania, aby uniknąć wysyłania danych tam iz powrotem z php –
serializować i unserializować są szybsze niż var_export, btw – raveren