Существует ли надежный, быстрый, детерминированный путь (т.е. не сравнительный тест), чтобы проверить, является ли системным диском, Mac OS X идет, Твердотельный накопитель?
Есть ли какой-либо другой индикатор, как хорошо диск обрабатывает параллельный доступ? Я пытаюсь скорректировать количество потоков, которые моя программа собирается использовать для ограниченных диском операций.
Я не интересуюсь необработанной скоростью или время поиска, только какой тип доступа – последовательный или параллельный – быстрее для диска. Я не ожидаю, что пользователи моей программы будут использовать iSCSI или RAID. SSD является моим фокусом, что-либо еще хорошо, чтобы.
Device Characteristics
из IOAHCIBlockStorageDevice
содержит эту информацию. Как я могу считать его программно?
До сих пор я выяснил, что это идет как это: (следующее является псевдокодом),
match = IOBSDNameMatching(kIOMasterPortDefault,0,"disk0s2");
IOServiceGetMatchingServices(kIOMasterPortDefault, match, &iterator);
while(entry = IOIteratorNext(iterator)) {
do {
entry = IORegistryEntryGetParentEntry(nextMedia, kIOServicePlane, &entry);
dict = IORegistryEntryCreateCFProperty(nextMedia,
CFSTR(kIOPropertyDeviceCharacteristicsKey), kCFAllocatorDefault, 0);
[dict objectForKey:CFSTR(kIOPropertyMediumTypeKey)];
}
while(!dict && entry);
}
Править: Вот полный исходный код. Я проверил, что это работает с Intel SSD и Вершиной OCZ.
Если вы пытаетесь получить такую информацию, вы лучше всего догадаетесь, это Iokit.
Вы можете попробовать некоторые из его функциональных возможностей, используя инструмент IOREG Инструмент командной строки или IoregistryExplorer .
Вот какой-то код, который может помочь вам. Это выбирает все жесткие диски, которые не являются рейдом и не разделы. Это не то, что вы хотите, но это может начать.
#import "TWDevice.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <paths.h>
#include <sys/param.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOBSD.h>
#include <IOKit/storage/IOMedia.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/Kext/KextManager.h>
@implementation TWDevice
@synthesize name, devicePath, size, blockSize, writable, icon;
+ (NSArray *)allDevices {
// create matching dictionary
CFMutableDictionaryRef classesToMatch;
classesToMatch = IOServiceMatching(kIOMediaClass);
if (classesToMatch == NULL) {
[NSException raise:@"TWError" format:@"Classes to match could not be created"];
}
// get iterator of matching services
io_iterator_t mediaIterator;
kern_return_t kernResult;
kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault,
classesToMatch,
&mediaIterator);
if (kernResult != KERN_SUCCESS) {
[NSException raise:@"TWError" format:@"Matching services did not succed."];
}
// iterate over all found medias
io_object_t nextMedia;
NSMutableArray *detectedDevices = [NSMutableArray array];
while (nextMedia = IOIteratorNext(mediaIterator)) {
NSMutableDictionary *properties;
kernResult = IORegistryEntryCreateCFProperties(nextMedia,
(CFMutableDictionaryRef *)&properties,
kCFAllocatorDefault, 0);
if (kernResult != KERN_SUCCESS) {
[NSException raise:@"TWError" format:@"Getting properties threw error."];
}
// is it a whole device or just a partition?
if ([[properties valueForKey:@"Whole"] boolValue] &&
![[properties valueForKey:@"RAID"] boolValue]) {
TWDevice *device = [[[TWDevice alloc] init] autorelease];
device.devicePath = [NSString stringWithFormat:@"%sr%@", _PATH_DEV, [properties valueForKey:@"BSD Name"]];
device.blockSize = [[properties valueForKey:@"Preferred Block Size"] unsignedLongLongValue];
device.writable = [[properties valueForKey:@"Writable"] boolValue];
device.size = [[properties valueForKey:@"Size"] unsignedLongLongValue];
io_name_t name;
IORegistryEntryGetName(nextMedia, name);
device.name = [NSString stringWithCString:name encoding:NSASCIIStringEncoding];
…
[detectedDevices addObject:device];
}
// tidy up
IOObjectRelease(nextMedia);
CFRelease(properties);
}
IOObjectRelease(mediaIterator);
return detectedDevices;
}
@end
В своих неофициальных тестах я обнаружил, что доступ/определение констант немного медленнее, чем обычные переменные/массивы.
это все равно не сделает другого; более чем вероятно, что все, что вы сделаете с ними, произойдет через тысячные доли секунды.
Оптимизация базы данных (индексирование, использование инструкции ПОЯСНИТЬ для проверки запросов) и набор сервера (с помощью APC) в долгосрочной перспективе будут иметь большее значение.
-121--4631868-Используйте urllib2 в сочетании с блестящей библиотекой Soup Soup :
import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())
for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
tds = row('td')
print tds[0].string, tds[1].string
# will print date and sunrise
-121--635951- На самом деле, я думаю, что вы должны пройти маршрут бенчмаркинга, потому что он более точно отвечает на ваш вопрос - вы не действительно заботитесь, что диск случается, чтобы Что делать, если пользователь использует быструю настройку RAID или массив Fiber Channel или iSCSI?
Просто прочитайте кучу случайных секторов из базового/dev/diskX, и если он соответствует вашим требованиям, вы можете рассматривать его как «быстрый» диск
В Debian пакет называется doxygen-gui. Это должно быть то же самое в Ubuntu, поэтому попробуйте sudo apt-get install doxygen-gui
.
Редактирование: видимо, доксиген-гуй не существует в Кармике. Попробовать другое репо? http://packages.ubuntu.com/search?keywords=doxygen-gui
-121--2427200- Вместо использования CURLOPT _ PUT = TRUE
используйте CURLOPT _ CUSTOMREQUEST = 'PUT'
и CURLOPT _ CUSTOMREQUEST = 'DELETE'
, затем просто набор значения с помощью CURLOPT _ POSTFIELDS
.
Количество потоков? 1 будет переполнять любой диск, твердотельный накопитель, RAID или нет. Диск медленный, процессор быстрый. ОС собирается переупорядочить ваши запросы на диск в любом случае (или, по крайней мере, должна), чтобы получить наименьшие движения головы.