Как я могу ускорить процесс выделения больших объектов, если у меня достаточно оперативной памяти?

Я могу решить этот вопрос, потому что я пытался реализовать простой метод CloneObject для произвольного класса (с конструктором по умолчанию)

С помощью общего метода вы можете потребовать, чтобы тип реализовал New ().

Public Function CloneObject(Of T As New)(ByVal src As T) As T
    Dim result As T = Nothing
    Dim cloneable = TryCast(src, ICloneable)
    If cloneable IsNot Nothing Then
        result = cloneable.Clone()
    Else
        result = New T
        CopySimpleProperties(src, result, Nothing, "clone")
    End If
    Return result
End Function

С не-generic предположим, что тип имеет конструктор по умолчанию и исключает исключение, если это не так.

Public Function CloneObject(ByVal src As Object) As Object
    Dim result As Object = Nothing
    Dim cloneable As ICloneable
    Try
        cloneable = TryCast(src, ICloneable)
        If cloneable IsNot Nothing Then
            result = cloneable.Clone()
        Else
            result = Activator.CreateInstance(src.GetType())
            CopySimpleProperties(src, result, Nothing, "clone")
        End If
    Catch ex As Exception
        Trace.WriteLine("!!! CloneObject(): " & ex.Message)
    End Try
    Return result
End Function
22
задан Martijn Pieters 2 May 2014 в 12:42
поделиться

4 ответа

Вероятно, вы связаны с накладными расходами на создание/выделение объектов в Python, а не с самим распихиванием. Если это так, то вы мало что можете сделать, чтобы ускорить это, кроме как не создавать все объекты. Нужна ли вам вся структура сразу? Если нет, то вы можете использовать ленивое заполнение структуры данных (например, представить части структуры маринованными строками, а затем распаковать их только при обращении к ним).

8
ответ дан 29 November 2019 в 02:58
поделиться

Почему бы вам не попробовать маршалинг ваших данных и хранение их в оперативной памяти с помощью memcached (например). Да, у него есть некоторые ограничения, но, как указывает this, marshaling намного быстрее (в 20-30 раз), чем pickling.

Конечно, вы также должны потратить столько же времени на оптимизацию структуры данных, чтобы минимизировать количество и сложность данных, которые вы хотите хранить.

4
ответ дан 29 November 2019 в 02:58
поделиться

почему вы не используете pickle.load?

f = open('fname', 'rb')
graph = pickle.load(f)
-4
ответ дан 29 November 2019 в 02:58
поделиться

Возможно, лучшее, что вы можете сделать, это разбить большие данные на маленькие объекты размером, скажем, менее 50 МБ, которые можно хранить в памяти, и объединить их.

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

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

0
ответ дан 29 November 2019 в 02:58
поделиться
Другие вопросы по тегам:

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