Я могу решить этот вопрос, потому что я пытался реализовать простой метод 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
Вероятно, вы связаны с накладными расходами на создание/выделение объектов в Python, а не с самим распихиванием. Если это так, то вы мало что можете сделать, чтобы ускорить это, кроме как не создавать все объекты. Нужна ли вам вся структура сразу? Если нет, то вы можете использовать ленивое заполнение структуры данных (например, представить части структуры маринованными строками, а затем распаковать их только при обращении к ним).
Почему бы вам не попробовать маршалинг ваших данных и хранение их в оперативной памяти с помощью memcached (например). Да, у него есть некоторые ограничения, но, как указывает this, marshaling намного быстрее (в 20-30 раз), чем pickling.
Конечно, вы также должны потратить столько же времени на оптимизацию структуры данных, чтобы минимизировать количество и сложность данных, которые вы хотите хранить.
почему вы не используете pickle.load
?
f = open('fname', 'rb')
graph = pickle.load(f)
Возможно, лучшее, что вы можете сделать, это разбить большие данные на маленькие объекты размером, скажем, менее 50 МБ, которые можно хранить в памяти, и объединить их.
На самом деле, нет способа автоматического разделения данных через модуль pickle, так что вам придется делать это самостоятельно.
В любом случае, другой способ (который довольно сложный) - использовать какую-нибудь NoSQL базу данных, например MongoDB, для хранения данных...