Неизменная Реализация Map для огромных карт

Если у меня есть неизменная Карта, от которой я мог бы ожидать (за очень короткий промежуток времени - как несколько секунд) добавлять/удалять сотни тысяч объектов, стандарт HashMap плохая идея? Скажем, я хочу передать 1 ГБ данных через Карту в <10 секунд таким способом, которым максимальным размером Карты в любом, после того как момент составляет только 256 МБ.

Я получаю впечатление, что карта сохраняет некоторую "историю", но я буду всегда получать доступ последнее обновление таблица (т.е. Я не раздаю карту), потому что это - переменная члена парламента, не занимающего официального поста Actor который обновляется/получается доступ только из реакций.

В основном я подозреваю, что эта структура данных может быть (частично) в отказе для проблем, которые я вижу вокруг выхода JVMs из памяти при чтении в больших количествах данных в скором времени.

Я был бы более обеспечен с другой реализацией Map и, если так, что это?

10
задан Community 23 May 2017 в 12:07
поделиться

3 ответа

Насколько я ненавижу элемент и подавляющее большинство случаев его использования, CSS3, похоже, вернул его :

-121--2764386-

Я немного опаздываю на шоу, но я подумал, что этот сценарий PowerShell будет полезен, имейте в виду, что я использую это только для своего локального окна разработки, поэтому извиняюсь за магические числа.

AuthFlags = 4 является интегрированной авторизацией

Он не совсем соответствует требованиям Марка, но это хорошее начало.

При загрузке инструментальных средств WMI их можно использовать для просмотра интерфейса WMI с метабазой IIS.

function CreateAppPool($poolName,$userName,$password)
{
    [wmiclass] $appPoolSettings = "root\MicrosoftIISv2:IISApplicationPoolSetting";
    $newPool = $appPoolSettings.CreateInstance();
    $newPool.Name = "W3SVC/AppPools/" + $poolName;
    $newPool.WAMUsername = $userName;
    $newPool.WAMUserPass = $password;
    $newPool.AppPoolIdentityType = 3;
    $newPool.Put();
    # Do it again if it fails as there is a bug with Powershell/WMI
    if (!$?)
    {
        $newPool.Put(); 
    }
}


function CreateWebsite($webSiteName, $path, $port, $appPoolName)
{
    [wmiclass] $bindingClass = 'root\MicrosoftIISv2:ServerBinding';
    $bindings = $bindingClass.CreateInstance();
    $bindings.Port = $port;
    $webService = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebService";
    $webSite = $webService.CreateNewSite($webSiteName, $bindings, $path);
    [int] $index = $webSite.ReturnValue.IndexOf("'") + 1;
    [int] $length = $webSite.ReturnValue.Length - $index - 1;
    [string] $websiteID = $webSite.ReturnValue.SubString($index, $length)  + "/root";
    $webVirtualDirSetting = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebVirtualDirSetting" | Where-Object {$_.Name -eq $websiteID};
    $webVirtualDirSetting.AppFriendlyName = $webSiteName;
    $webVirtualDirSetting.AppPoolId = $appPoolName;
    $webVirtualDirSetting.AccessFlags = 517;
    $webVirtualDirSetting.AuthFlags = 4;
    $webVirtualDirSetting.Put();

    #Switch the Website to .NET 2.0
    C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -sn W3SVC/
}

$webSiteName = "MyWebsiteName";
$webSitePath = "C:\MyWebsitePath";
$webSitePort = "9001";
$appPoolName = "MyWebsitePool";
$appPoolIdentity = "MYDESKTOP\MyWebsiteIdentity";
$appPoolPassword = "MyWebsitePassword"; 

CreateAppPool $appPoolName $appPoolIdentity $appPoolPassword
CreateWebsite $webSiteName $webSitePath $webSitePort $appPoolName
-121--2805835-

Почему вы должны использовать незыблемую карту? Бедный сборщик мусора! Неизменяемые карты обычно требуют (log n) новых объектов за операцию в дополнение к (log n) времени, или они действительно просто переносят изменяемые хэш-карты и наборы изменений слоев сверху (что замедляет вещи и может увеличить число объектов создания).

Неизменность велика, но мне не кажется, что это время для ее использования. На вашем месте я бы придерживался scala.collection.mutable.HashMap . Если требуется параллельный доступ, оберните вместо этого файл Java util.concurrat.

Вы также можете увеличить размер молодого поколения в JVM: -Xmn1G или более (предполагая, что вы работаете с -Xmx3G ). Также используйте пропускную способность (параллельный) сборщик мусора.

20
ответ дан 3 December 2019 в 14:43
поделиться

Это было бы ужасно. Вы говорите, что всегда хотите получить доступ к последней обновленной таблице, это означает, что вам нужна только эфемерная структура данных, нет необходимости платить за постоянную структуру данных - это например, торгуйте временем и памятью, чтобы получить совершенно спорные «очки стиля». Вы не строите свою карму, используя слепо стойкие структуры, когда они не нужны.

Кроме того, хеш-таблица - это структура, которую особенно сложно сделать постоянной. Другими словами, «очень, очень медленно» (в основном это можно использовать, когда операций чтения намного больше, чем операций записи - и вы, кажется, говорите о многих операциях записи).

Между прочим, ConcurrentHashMap не имеет смысла в этом дизайне, учитывая, что доступ к карте осуществляется одним действующим лицом (это я понимаю из описания).

8
ответ дан 3 December 2019 в 14:43
поделиться

Так называемая (*) неизменяемая карта Scala выходит за рамки базового использования вплоть до Scala 2.7. Не верьте мне, просто посмотрите количество открытых билетов на него. И решение - просто «он будет заменен чем-то другим в Scala 2.8» (что он и сделал).

Итак, если вам нужна неизменяемая карта для Scala 2.7.x, я бы посоветовал искать ее не в Scala. Или просто используйте TreeHashMap.

(*) Неизменяемая карта Scala на самом деле не является неизменной. Это внутренне изменяемая структура данных, которая требует большой синхронизации.

4
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

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