Я тестировал приложение, вставляя около 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-двоичный распределитель af- a fit) и попытался снова, но ошибка была такой же,
примечание :: я использую версию erlang r12b, а системная оперативная память составляет 8 ГБ на ubuntu 10.04, могу ли я узнать, как решить эту проблему?
определения записей:
%% database -record (база данных, {dbid, guid, data}).
%% changelog -record (журнал изменений, {dbid, отметка времени, список изменений, тип}).
здесь данные - это vcard (контактная информация), dbid и type - это контакты, guid - это целое число, автоматически сгенерированное сервером
запись базы данных содержит все данные vcard всех пользователей. если есть 1000 пользователей и каждый пользователь имеет 1000 контактов, то у нас будет 10 ^ 6 записей.
запись журнала изменений будет содержать, какие изменения были сделаны в таблице базы данных на этой отметке времени
код для создания таблиц:
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}).