26.09.2017 00:34, Mengu пишет:
hi all
this following code block [0] is exiting with "terminated by signal
SIGBUS (Misaligned address error)" error. it processes like 200K rows
and then fails. any ideas?
void getHotels() {
import std.parallelism : taskPool;
import std.functional : partial;
auto sunHotels = new SunHotels();
auto destinations = sunHotels.parseDestinations();
auto conn = client.lockConnection();
auto destinationResult = conn.execStatement("SELECT provider_ref, id
FROM hotels_destination", ValueFormat.BINARY);
int[int] destinationIds;
foreach (row; rangify(destinationResult)) {
destinationIds[row["provider_ref"].as!PGinteger] =
row["id"].as!PGinteger;
}
foreach (destination; parallel(destinations)) {
const string destId = to!string(destination.destinationId);
const auto destinationFilePath = getcwd() ~ "/ext/data/hotels/" ~
destId ~ ".xml";
auto xmlFile = new MmFile(destinationFilePath);
auto fileContents = cast(string)xmlFile[0..xmlFile.length];
auto hotels = sunHotels.parseHotelsResult(fileContents);
const destIdInDb = destinationIds[destination.destinationId];
auto sqls = appender!string;
writeln("parsing destination: ", destination.destinationName);
foreach (hotel; parallel(hotels)) {
sqls.put(hotel.generateSql(destIdInDb).data.join);
}
sqls.data.writeln;
delete fileContents;
delete xmlFile;
}
}
this is the full trace i got [1]:
#0 0x0000000000bef5ef in gc.impl.conservative.gc.Gcx.smallAlloc(ubyte,
ref ulong, uint) ()
[Current thread is 1 (LWP 100171)]
(gdb) bt full
#0 0x0000000000bef5ef in gc.impl.conservative.gc.Gcx.smallAlloc(ubyte,
ref ulong, uint) ()
No symbol table info available.
#1 0x0000000000bf3925 in
gc.impl.conservative.gc.ConservativeGC.runLocked!(gc.impl.conservative.gc.ConservativeGC.mallocNoSync(ulong,
uint, ref ulong, const(TypeInfo)), gc.impl.conservative.gc.mallocTime,
gc.impl.conservative.gc.numMallocs, ulong, uint, ulong,
const(TypeInfo)).runLocked(ref ulong, ref uint, ref ulong, ref
const(TypeInfo)) ()
No symbol table info available.
#2 0x0000000000bed103 in
gc.impl.conservative.gc.ConservativeGC.qalloc(ulong, uint,
const(TypeInfo)) ()
No symbol table info available.
#3 0x0000000000b9c6e3 in gc_qalloc ()
No symbol table info available.
#4 0x0000000000b96140 in core.memory.GC.qalloc(ulong, uint,
const(TypeInfo)) ()
No symbol table info available.
#5 0x000000000093fdce in
std.array.Appender!(immutable(char)[]).Appender.ensureAddable(ulong)
(this=..., nelems=761)
at
/home/search-master/dmd2/freebsd/bin64/../../src/phobos/std/array.d:2929
len = 394
reqlen = 1155
newlen = 1155
u = 0
overflow = false
nbytes = 1155
bi = {base = 0x2b1, size = 140737488337376, attr = 4294949280}
#6 0x0000000000942c0f in
std.array.Appender!(immutable(char)[]).Appender.put!(immutable(char)[]).put(immutable(char)[]).bigDataFun(ulong)
(
this=0x7fffffffb9f0, extra=761)
at
/home/search-master/dmd2/freebsd/bin64/../../src/phobos/std/array.d:3023
No locals.
#7 0x0000000000942b55 in
std.array.Appender!(immutable(char)[]).Appender.put!(immutable(char)[]).put(immutable(char)[])
(this=...,
---Type <return> to continue, or q <return> to quit---
at
/home/search-master/dmd2/freebsd/bin64/../../src/phobos/std/array.d:3026
bigData = "'"
len = 760
newlen = 34799909888
not big deal probably, but isn't ~32GB enormous value here? I would
check why bigDataFun return this.