я тестировал приложение, вставив около 1000 пользователей и каждого пользователя, имеющего 1000 контактов, в таблицу базы данных в mnesia, и во время вставки в какой-то части я получил следующую ошибку:
Crash dump was written to: erl_crash.dump
binary_alloc: Cannot allocate 422879872 bytes of memory (of type "binary").
Aborted
я началэмулятор erl с erl + MBas af (B-бинарный распределитель после подгонки) и попытался снова, но ошибка была той же,
note :: я использую версию erlang r12b исистемная оперативная память на Ubuntu 10.04 составляет 8 ГБ, так что я могу знать, как ее решить?
определения записей:
%% database -record (database, {dbid, guid, data}).
%% changelog -record (changelog, {dbid, timestamp, changelist, type}).
здесь данные являются vcard (контактinfo), dbid и type - это «contacts», guid - это целое число, автоматически генерируемое сервером
запись базы данных содержит все данные vcard всех пользователей. Если существует 1000 пользователей и каждый пользователь имеет 1000 контактов, тоу нас будет 10 ^ 6 записей.
reco changelogrd будет содержать данные об изменениях, внесенных в таблицу базы данных в этот момент времени.
код для создания таблиц:
mnesia:create_table(database, [{type,bag}, {attributes,Record_of_database},
{record_name,database},
{index,guid},
{disc_copies,[node()]}])
mnesia:create_table(changelog, [{type,set}, {attributes,Record_of_changelog},
{record_name,changelog},
{index,timestamp},
{disc_copies,[node()]}])
вставка записей в таблицу:
commit_data(DataList = [#database{dbid=DbID}|_]) ->
io:format("commit data called~n"),
[mnesia:dirty_write(database,{database,DbId,Guid,Key})|| {database,DbId,Guid,X}<-DataList].
write_changelist(Username,Dbname,Timestamp,ChangeList) ->
Type="contacts",
mnesia:dirty_write(changelog,{changelog,DbID,Timestamp,ChangeList,Type}).