| 

.NET C# Java Javascript Exception

9
Hallo,

mit MemoryMappedFile hole ich mir einen Dateiinhalt:

using (MemoryMappedFile fi = MemoryMappedFile.CreateFromFile("myfile.xxx"))  
using (MemoryMappedViewStream stream = fi.CreateViewStream())

...



Mit einer Schleife durchlaufe ich dann den Stream "stream" abschnittweise. Dazu verschiebe ich stream.Position um die jeweilige Blockgrösse immer weiter.

stream.Position = ...
stream.Read...
// Verarbeitung des buffers
stream.Position = ...
stream.Write...


Gelesen wird ein byte[] Array "buffer", was nachfolgend und verändert wieder in den Stream zurückgeschrieben wird (stream.Read und ...Write). Diese Vorgehensweise funktioniert. Zeitmessungen ergaben, dass eine gute Zeit mit einer size-Grösse von 4096 erreicht werden kann.

Kann man das schneller umsetzen? Ach so, die files sind so um die 150 G gross. Ausserdem würde ich gerne mit grösseren size-Blöcken arbeiten.

Herzlichen Dank

Falkner

1. Selbstversuch:

Bei relativ kl. Dateien konnte ich m. d. folgenden unsafe-Meth. Geschwindigkeitszuwachs erreichen:

private static unsafe byte[] ReadBytes(int offset, int blockSize, MemoryMappedViewAccessor acc)
{
byte[] buf = new byte[blockSize];
byte *p = (byte*)0;
acc.SafeMemoryMappedViewHandle.AcquirePointer(ref p);
Marshal.Copy(IntPtr.Add(new IntPtr(p), offset), buf, 0, blockSize);
acc.SafeMemoryMappedViewHandle.ReleasePointer();
return buf;
}

private static unsafe void WriteBytes(int offset, byte[] buf, MemoryMappedViewAccessor acc)
{
byte* p = (byte*)0;
acc.SafeMemoryMappedViewHandle.AcquirePointer(ref p);
Marshal.Copy(buf, 0, IntPtr.Add(new IntPtr(p), offset), buf.Length);
acc.SafeMemoryMappedViewHandle.ReleasePointer();
}


Mit exakt 150 GB schmierte das Prog. allerdings ab.


Das Ergebnis meiner Selbstversuche:

Den Selbstversuch Nr. 2 habe ich gelöscht, weil er Murks war (ich war wohl zu übermüdet).

Sehr viele Versuche führten zum folgenden Ergebnis, welches f. x32 das schnellste sein könnte.

Die nachfolgende Klasse lann so aufgerufen werden:


var file = "file.xxx";

Console.WriteLine("Test with Unsafe_MMF...");
Class2.Measure(() => Class2.Unsafe_Test(file));



Ich habe zwar mit 2 MemoryMappedFiles hantiert, es sollte aber auch mit einem funktionieren.

50 GB können in etwa 28 Sekunden runtergearbeitet werden. Für kleinere Dateigrössen sollte ev. die verwendete Blockgrösse geändert werden (ausprobieren). Die Ergebniszeit ist auch stark von der Rechnerauslastung abhängig, wie ich feststellte.

Der Code ist ohne Sicherungen u. reagiert auf Fehler sehr empfindlich!

Ich sehe das Thema nun als beendet an und bedanke mich noch einmal für die nette Mithilfe von Matthias Hlawatsch und ffordermaier. Falls es jemand probieren möchte, viel Spass damit.

Ich hab jetzt keine Ahnung, bei wem ich den grünen Pfeil setzen soll - ich mache ihn einfach mal bei Matthias Hlawatsch.

Schönen Abend

Falkner

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Linq;
using System.Runtime.InteropServices;

namespace Irgendwas
{
// unsafe muss erlaubt werden!

internal class Class2
{
private Class2(){ }

internal static void Unsafe_Test(string fileName)
{
//var file = fileName;
FileInfo f = new FileInfo(fileName);
string ext = f.Extension;
var fileName2 = fileName + ".zwe";

if(!File.Exists(fileName2))
{
File.Copy(fileName, fileName2);
}

int size = 1024 * 1024 * 64, restSize;
long fileSize = new FileInfo(fileName).Length, pos = 0;
long nBlocks = fileSize - (fileSize % (size));
byte[] data = new byte[size];
int i;
MemoryMappedViewAccessor acc1 = null, acc2 = null;

try
{
using (var mmf1 = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open,"ImgA"))
{
using (var mmf2 = MemoryMappedFile.CreateFromFile(fileName2, FileMode.OpenOrCreate,"ImgB"))
{
while(pos < nBlocks)
{
acc1 = mmf1.CreateViewAccessor(pos, size);
acc2 = mmf2.CreateViewAccessor(pos, size);

data = ReadBytes(0, size, acc1);
i = -1;
while(i++ < (size-1))
data[i] = (byte)166;

WriteBytes(0, data, acc2);

pos += size;
}

restSize = (int)(fileSize - pos);

if(restSize > 0)
{
acc1 = mmf1.CreateViewAccessor(pos, restSize);
acc2 = mmf2.CreateViewAccessor(pos, restSize);
data = new byte[restSize];
data = ReadBytes(0, restSize, acc1);

i = -1;
while(i++ < (size-1))
data[i] = (byte)106;

WriteBytes(0, data, acc2);
}
}
}
}
catch
{

}
finally
{
acc1.Flush(); acc1.Dispose();
acc2.Flush(); acc2.Dispose();
}
}

private static unsafe byte[] ReadBytes(int offset, int blockSize, MemoryMappedViewAccessor acc)
{
byte[] buf = new byte[blockSize];
byte *p = (byte*)0;
acc.SafeMemoryMappedViewHandle.AcquirePointer(ref p);
Marshal.Copy(IntPtr.Add(new IntPtr(p), offset), buf, 0, blockSize);
acc.SafeMemoryMappedViewHandle.ReleasePointer();
return buf;
}

private static unsafe void WriteBytes(int offset, byte[] buf, MemoryMappedViewAccessor acc)
{
byte* p = (byte*)0;
acc.SafeMemoryMappedViewHandle.AcquirePointer(ref p);
Marshal.Copy(buf, 0, IntPtr.Add(new IntPtr(p), offset), buf.Length);
acc.SafeMemoryMappedViewHandle.ReleasePointer();
}

internal static bool Measure(Action action)
{
Stopwatch watch = new Stopwatch();
watch.Start();

action();

watch.Stop();

Console.WriteLine("Execution took {0} seconds.", watch.Elapsed.Seconds);
return true;
}
}
}



Update:

So einige Tests hatten sehr unterschiedliche Ergebnisse geliefert. Ich wollte aber eine "sichere" und "schnelle" Lösung f. x32 (f. x64 sollte wohl eine Veränderung bzw. eine andere Lösung herhalten... !?).

Meine momentan verwendete Lösung sieht (m. leichten Änderungen) so aus:




internal class MemoryMappedFile_x32
{
internal MemoryMappedFile_x32() { }

internal bool RW(string fileName1, string fileName2)
{
long fileSize = new FileInfo(fileName1).Length, nBlocks, pos = 0;
int size;

if(fileSize < (1024 * 1024 * 192 +1))
{
size = (int)fileSize;
nBlocks = 1;
}
else
{
size = 1024 * 1024 * 192;
nBlocks = fileSize - (fileSize % (size));
}

try {
using (var mmf1 = MemoryMappedFile.CreateFromFile(fileName1, FileMode.Open))
using (var mmf2= MemoryMappedFile.CreateFromFile(fileName2, FileMode.Create, "zwe", fileSize))
{
while(pos < nBlocks)
{
Block(mmf1, mmf2, pos, size);
pos += size;
}
size = (int)(fileSize - pos);

if(size > 0)
Block(mmf1, mmf2, pos, size);
}
return true;
}
catch { return false; }
finally { GC.Collect(); }
}

private bool Block(MemoryMappedFile mmf1, MemoryMappedFile mmf2, long pos, int size)
{
try
{
byte[] data = new byte[size];
using (var acc1 = mmf1.CreateViewAccessor(pos, size))
using (var acc2 = mmf2.CreateViewAccessor(pos, size))
{
data = ReadBytes(0, size, acc1);

/* do it ...*/

WriteBytes(0, data, acc2);
acc1.Flush();
acc2.Flush();
}
return true;
}
catch
{
return false;
}
}

private unsafe byte[] ReadBytes(int offset, int blockSize, MemoryMappedViewAccessor acc)
{
byte[] buf = new byte[blockSize];
byte *p = (byte*)0;
acc.SafeMemoryMappedViewHandle.AcquirePointer(ref p);
Marshal.Copy(IntPtr.Add(new IntPtr(p), offset), buf, 0, blockSize);
acc.SafeMemoryMappedViewHandle.ReleasePointer();
return buf;
}

private unsafe void WriteBytes(int offset, byte[] buf, MemoryMappedViewAccessor acc)
{
byte* p = (byte*)0;
acc.SafeMemoryMappedViewHandle.AcquirePointer(ref p);
Marshal.Copy(buf, 0, IntPtr.Add(new IntPtr(p), offset), buf.Length);
acc.SafeMemoryMappedViewHandle.ReleasePointer();
}
}


Schönen Tag

Falkner
25.09.2013
Falkner 795 3 9
Falkner 795 3 9
Ist die Verwendung von MemoryMappedFiles eigentlich ein Muß, oder könntest Du ggf. auch darauf verzichten?
Matthias Hlawatsch 27.09.2013
Ein sog. Muß gibt es nicht, Geschwindigkeit steht im Vordergrund.
Falkner 27.09.2013
Danke, dass Du Deine Ergebnisse mit uns teilst :-)
ffordermaier 14.10.2013
Genau, dafür auch von mir ein Dankeschön! Freut mich, daß ich helfen konnte, und gelernt habe ich auch so einiges.
Mich würde noch interessieren, mit welcher Hardware Du arbeitest. 50GB in 28s, also fast 2GB/s lesen UND schreiben - was steckt da dahinter? Das ist schneller als der aktuelle SATA-Standard überhaupt Daten transportieren kann, von den Laufwerken ganz zu schweigen.


Matthias Hlawatsch 14.10.2013
Ansonsten noch zwei Tips:
1.) [i] wird auch in Codebeispielen als italic-Formatierung interpretiert (Bug in codekicker). Ein Würgaround ist das Escapen als \[i]. Ich hab das in Deinem Beispiel noch nachgeholt.
2.) Reine Edits triggern leider keine Benachrichtigungen. Und schieben die Frage auch nicht auf der CK-Homepage wieder nach oben. Deshalb habe ich von Deinem Update auch erst mal gar nichts mitbekommen. Ich mach das deshalb immer so, dass ich nach einem Edit noch einen Kommentar schreibe, der darauf hinweist.
Matthias Hlawatsch 14.10.2013
7 Antworten
4
Wenn es nicht unbedingt ein MemoryMappedFile sein muß: hast Du mal versucht, aus der einen Datei nur zu lesen (sequentiell, mit einem normalen FileStream) und die veränderten Daten in eine temporäre Datei zu schreiben, die nach erfolgreichem Abschluß der Aktion die Ursprungsdatei ersetzt? Klar, das kostet vorübergehend zusätzliche 150 GB Plattenplatz - aber Geschwindigkeitssteigerung und Minimierung des Ressourcenverbrauchs stehen ja meistens in Konkurrenz.

Update:
Ich habe den "Benchmark" der von Falkner angegebenen Seite (siehe Kommentar unter dieser Antwort) mal ausprobiert - allerdings mit Dateien, die deutlich größer sind als der 4MB-Winzling, den sie dort verwendet hatten (50MB-33GB). Entsprechend hatte ich auch Ausführungszeiten im 1-3stelligen Sekundenbereich. Da ich keine genügend großen Testdateien hatte, deren Struktur ich kannte, habe ich die Read-Methode geändert, so daß sie einfach alle Bytes gelesen hat - mit ReadByte oder Read (mit einem 64KB-Puffer).
Ergebnis: ich kann die Aussage des Benchmark-Seite nicht bestätigen. Und es ist alles gar nicht so einfach...

  • Mit FileStream eine Datei sequentiell zu lesen ist schnell. Ich habe ungefähr 75% der Lesegeschwindigkeit erreicht, die meine SSD laut Testergebnissen im Internet hergeben könnte.
  • Wenn der Input klein genug für den Hauptspeicher ist, liest auch ein MemoryMappedFile schnell, allerdings nicht schneller als ein FileStream (Ausnahme: s. nächster Punkt).
  • Wenn der Input klein genug für den Hauptspeicher ist, muß man auch aufpassen, daß nicht irgendwo ein Cache zuschlägt. Beim zweiten Testlauf mit der selben Datei hatte ich dann viel bessere Ergebnisse (für beide Zugriffsarten). Das könnte auch die Benchmark-Ergebnisse erklären: wenn Test1 mit dem FileStream vor dem Test2 mit dem MemoryMappedFile läuft, dann greift Test2 u.U. gar nicht mehr auf die Platte zu.
  • Mit dem MemoryMappedFile muß man aufpassen, was in der Read-Methode (des Benchmarks) passiert. Wenn ich auf jedes Byte einzeln zugegriffen habe, dann war das 10-30mal langsamer als mit dem FileStream. Mit Stream.Read die Daten in 64KB-Blöcken zu lesen, war dann deutlich schneller. Bei FileStream hat das keinen großen Unterschied gemacht (weil da sowieso intern ein Puffer verwendet wird?)
  • Mit einer Datei, die rund doppelt so groß wie mein RAM ist, war der Zugriff via MemoryMappedFile ca. 7mal langsamer als mit dem FileStream, und der Hauptspeicher war während der Ausführung komplett belegt.

Was heißt das nun für Dein Szenario?

  • Unbedingt jeden Ansatz mit Dateien testen, die deutlich größer als Dein RAM sind. Du könntest sonst auch mit MemoryMappedFile noch eine böse Überraschung erleben.
  • Wenn Du verschiedene Ansätze vergleichst, dann achte auf Seiteneffekte wie Caching, die die Meßergebnisse beeinflussen könnten. Verschiedene Dateien verwenden, mal mit der einen Methode beginnen, mal mit der anderen, usw.
  • Wenn Du mit FileStream eine sehr schlechte Performance hattest, solltest Du nochmal schauen, woran das liegen könnte (es sei denn, Du hast analog zu Deinem MMF-Ansatz mit Verschieben des Positionszeigers im Stream gearbeitet; dann würde es mich nciht wundern, aber das hatte ich ja auch nicht vorgeschlagen). Sequentielles Lesen müßte sehr schnell sein, sequentielles Schreiben eigentlich auch (auch wenn ich das nicht getestet habe). Offen wäre allerdings noch das Entfernen der "alten" Daten, wenn das für Dich wichtig ist.

Übrigens: wenn ich mir so die MSDN-Doku zu MemoryMappedFile anschaue - warum arbeitest Du eigentlich mit CreateViewStream ("You can use the stream returned by this method for sequential access to a memory-mapped file, such as for inter-process communications.") statt mit einer der Überladungen von CreateViewAccessor ("You can use the view returned by this method for random access to a memory-mapped file.")? Bei CreateViewAccessor müßtest Du den Positionszeiger nicht nach jedem Block verschieben, sondern könntest direkt positionsgenau die Bytes lesen, ändern und wieder schreiben. Wäre vielleicht auch noch einen Versuch wert.

Zuguterletzt eine Frage, die eigentlich die erste hätte sein müssen: wie schnell ist Deine aktuelle Lösung im Vergleich zur geforderten Geschwindigkeit? "Kann man das schneller umsetzen" ist zwar eine interessante Frage für codekicker, aber Du solltest auch daran denken, zur rechten Zeit aufzuhören mit dem Optimieren...
27.09.2013
Matthias Hlawatsch 13,2k 4 9
Eine tmp.-Datei scheidet in jedem Falle aus, weil ich im Anschluss an den Schreibvorgang die tem.-Datei zusätzlich überschreiben müsste (Sicherheit).
Falkner 27.09.2013
Ich habe nicht so die Ahnung, wie sich das auf anderen PCs so verhält, Versuche mit 5 unterschiedlichen PCs ergaben das Resultat: FileStream ist extrem langsam! Widersprüche sind hier erwünscht. Eine Datei einfach mal so ersetzen, das ist einfach, funktioniert nur im Programm, eine ersetzte Datei ist immer noch da - obwohl sie ersetzt wurde. Sicherheit = "nix".
Falkner 27.09.2013
Danke, daß Du es mal ausprobiert hast. Bin erstaunt - hätte erwartet, daß sequentielles Lesen und Schreiben dem ständigen Neu-Positionieren des Streams überlegen sein müßte. Zumindest im Falle von Festplatten könnte es vielleicht daran liegen, daß beim parallelen Schreiben und Lesen (an verschiedenen Positionen) die Mechanik ziemlich heftig bewegt wird?
Was mich gar nicht überrascht: wenn man über ein Problem redet, tauchen auf einmal vorher nicht benannte Anforderungen auf - hier der Sicherheitsaspekt.
Matthias Hlawatsch 28.09.2013
Ich habe noch einen link gefunden. Auf der Seite wird eine Zeitmessung (auch mit FileStream) vorgenommen. Im Code-Beispiel wird MemoryMappedFile ähnl. wie in meinem Beispiel angewendet:

http://www.dotnetperls.com/memorymappedfile-benchmark

Viel Spass beim Selbsttest (falls es ausprobiert werden sollte).
Falkner 28.09.2013
Siehe mein Update...
Matthias Hlawatsch 01.10.2013
@Matthias Hlawatsch: Vielen Dank! Jetzt "fallt mir erst mal die Kinnlade herunter"! FileStream ist wieder im Test.

Zum l. Abs.: Die geforderte Geschwindigkeit liegt (im Vergl. zur aktuellen) bisher zu niedirig. Die Buffer-Verarbeitung nimmt sehr viel Zeit in Anspruch (pro GB können schon etwa 1-2 Minuten veranschlagt werden). Deshalb wollte ich zumindest die Read/ Write Aktionen schnell erledigen können. Dem Link v. DotNetPerls hatte ich wohl zu schnell vertraut. Ich werde mein Test-Prog. total ändern! Kann etwas dauern, aber die Lösung werde ich zeigen.

Falkner
Falkner 01.10.2013
Bitteschön! :-)
Wenn die Verarbeitung der Blöcke der eigentliche Flaschenhals ist, dann solltest Du als erstes versuchen, diese zu parallelisieren. Mit I/O-Optimierung gewinnst Du vielleicht 10s/GB, ein Ausnutzen von 4 statt 1 Kernen könnte hingegen 45-90s/GB bringen.
CreateViewAccessor würde ich mir dazu anschauen (mit chunk-Größen, die bequem in den RAM passen), den Vorschlag von ffordermaier, oder ein Thread liest Blöcke via FileStream und verteilt von da die Arbeit an weitere Threads (dann bliebe aber noch zu klären, wie die Ergebnisse wieder zusammengeführt werden können).
Matthias Hlawatsch 01.10.2013
Für das v. mir versprochene Testergebnis wäre es nötig zu wissen, womit der FileStream eingesetzt wurde (BinaryReader/ BinaryWriter od. BaseStream etc.), d. eine geringere Zeit als MemoryMappedFile in deinen Tests erreichte. Mein Testaufbau wird ähnlich dem v. ffordermaier sein (allerdings mit Berücksichtigung d. blocksüberschüssigen Bytes). Ich werde mich über eine Info sehr freuen.
Falkner 05.10.2013
Ich habe ohne weitere Kapselung mit BinaryReader oder dergleichen direkt aus dem FileStream gelesen (FileStream.Read(byte[], int, int)).
Matthias Hlawatsch 05.10.2013
4
Ob eine größere Block-Size oder Ähnliches noch hilft, Deinen sequentiellen Ablauf zu beschleunigen, kann ich Dir leider nicht beantworten. Arg viel wird aber wohl nicht mehr gehen.

Deshalb rate ich Dir dazu, das Problem parallel zu lösen. Soweit ich Dich verstehe, sind die zu bearbeitenden Blöcke voneinander unabhängig, Du hast also eine Fall von Datenparallelität. Glücklicherweise bietet die MemoryMappedFile-Klasse für die Methode CreateViewStream eine Überladung, die Dir erlaubt, das MMF schon über den Stream zu partitionieren.

Du könntest dann entweder einen eigenen Partitionierer implementieren oder auf eine hinreichend gute Standardpartitionierung setzen. Die erste Lösung bietet sich an, wenn die Rechner, die Deine Files verarbeiten sehr unterschiedlich sind, die zweite Variante bietet sich an, wenn Du mit nahezu derselben Hardware arbeitest und gezielt auf eine Hardwareplattform optimieren möchtest.


Beispiel:
Sorry, Sample hat ein wenig gedauert, Zeit war rar die letzten Tage...

Ich habe das mit einem 1,4GB File getestet (Office 2013 ISO), auf einer 64-Bit Windows 8.1 VM mit 4 Kernen und 8GB RAM. Die VM selbst liegt physikalisch komplett auf einer SSD.

Meine Erkenntnisse:

  • Parallel ist auf alle Fälle schneller als sequentiell.
  • Der ViewStream outperformed den ViewAccessor. Parallele Verarbeitung mit Accessor dauert nur unwesentlich weniger Zeit als sequentielle Verarbeitung.
  • Die Chunk-Size hat auf den sequentiellen Vorgang keine Auswirkung, bei paralleler Verarbeitung sind größere Chunks besser. (Im Beispiel ist ein Chunk 64MB groß)
  • Meine Implementierung ist sicherlich noch nicht optimal, aber 30-40% Steigerung durch Parallelverarbeitung sind auch damit schon drin.


public class Program
{
private const int chunkSize = 1024 * 1024 * 64;

private static void Main(string[] args)
{
var file = args[0];
var fileToProcess = file + ".process";

File.Delete(fileToProcess);
File.Copy(file, fileToProcess);

Console.WriteLine("Processing sequentially...");
Measure(() => ProcessFileSequentially(fileToProcess));

Console.WriteLine("Processing in parallel using view stream...");
Measure(() => ProcessFileInParallelUsingViewStream(fileToProcess));

Console.WriteLine("Processing in parallel using view accessor...");
Measure(() => ProcessFileInParallelUsingViewAccessor(fileToProcess));

File.Delete(fileToProcess);
Console.ReadKey();
}

private static void Measure(Action action)
{
Stopwatch watch = new Stopwatch();
watch.Start();

action();

watch.Stop();

Console.WriteLine("Execution took {0} seconds.", watch.Elapsed.Seconds);
}

private static void ProcessFileInParallelUsingViewStream(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

using (var mmf = MemoryMappedFile.CreateFromFile(fileName))
{
Parallel.ForEach(
Partitioner.Create(0, fileSize, chunkSize),
() => mmf.CreateViewStream(0,0),
(range, state, l, stream) =>
{
byte[] data = new byte[chunkSize];
var currentChunkSize = (int)(range.Item2 - range.Item1);
stream.Position = range.Item1;

stream.Read(data, 0, currentChunkSize);

for (int i = 0; i < currentChunkSize; i++)
data[i] = (byte)(Byte.MaxValue - data[i]); // pseudo manipulation

stream.Position = range.Item1;
stream.Write(data, 0, currentChunkSize);

return stream;
},
stream => stream.Dispose());
}
}

private static void ProcessFileInParallelUsingViewAccessor(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

using (var mmf = MemoryMappedFile.CreateFromFile(fileName))
{
Parallel.ForEach(
Partitioner.Create(0, fileSize, chunkSize),
() => mmf.CreateViewAccessor(),
(range, state, l, accessor) =>
{
byte[] data = new byte[chunkSize];
var currentChunkSize = (int)(range.Item2 - range.Item1);

accessor.ReadArray(range.Item1, data, 0, currentChunkSize);

for (int i = 0; i < currentChunkSize; i++)
{
data[i] = (byte)(Byte.MaxValue - data[i]); // pseudo manipulation
}

accessor.WriteArray(range.Item1, data, 0, currentChunkSize);

return accessor;
},
accessor => accessor.Dispose());
}
}

private static void ProcessFileSequentially(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

var fileSizeWithFullChunks = fileSize - (fileSize % chunkSize);

using(var mmf = MemoryMappedFile.CreateFromFile(fileName))
using (var stream = mmf.CreateViewStream(0,0))
{
byte[] data = new byte[chunkSize];

for (long l = 0; l < fileSizeWithFullChunks; l += chunkSize)
{
stream.Position = l;
stream.Read(data, 0, chunkSize);

for (int i = 0; i < chunkSize; i++)
{
data[i] = (byte)(Byte.MaxValue - data[i]); // pseudo manipulation
}

stream.Position = l;
stream.Write(data, 0, chunkSize);
}
}
}
}
27.09.2013
ffordermaier 8,4k 3 9
Das sieht f. mich etwas neu aus. Ich werde mir die links mal ansehen u. ggf. noch einmal nachfragen.
Falkner 27.09.2013
Ich habe gerade eben die sehr guten links eingesehen u. bedanke mich f. die ausführliche Beantwortung. Sollte ich darüber eine schnellere Möglichkeit gefunden haben, werde ich in ca. 1 Woche diese hier veröffentlichen.

Vielen Dank

Falkner
Falkner 27.09.2013
Freut mich, wenn ich Dir einen Denkanstoß liefern konnte (recht viel mehr war es ja nicht...). Dass Du Deine Erkenntnisse mit uns teilen wirst, freut mich sehr.
ffordermaier 27.09.2013
Manchmal liegt eine Lösungsfindung genau darin und in der folgenden Assoziation. Also bitte keine Unterbewertung!

Falkner
Falkner 27.09.2013
Ich habe jetzt mal pos und length direkt dem stream übergeben und mir eine Positionssetzung eingespart. Die Zeit ist identisch mit meinem Ur-Code.

stream = fi.CreateViewStream(p, le);
stream.Read(b, 0, le);
// buffer-Verarbeitung
stream.Position = 0;
stream.Write(b, 0, le);

Die Partitionierer werde ich noch weiter in Augenschein nehmen und damit experimentieren. Augenblicklich neige ich doch eher zu meinem Anfangs-Code.Ich werde das Thema noch einige Tage offen lassen und dann als beantwortet abschliessen. Es könnte ja noch eine tolle Lösung von jemandem kommen...!
Falkner 29.09.2013
NACHTRAG:

Für den Lese/Schreibvorgang einer Datei (1,33 GB (1.428.885.720 Bytes)) mit 4096 blocks benötigen:

mein Code oben: 16352547700,00 ns
d. veränderte Code: 15695137700,00 ns

Mehrmalige Versuche nacheinander zeigten aber, dass sich das Ergebnis manchmal andersherum verhält.
Falkner 29.09.2013
@Falkner: mit welchen Dateigrößen testest Du ansonsten? In der Frage hast Du was von 150GB geschrieben, hier nur 1,33 GB - ich könnte mir vorstellen, daß es für MemoryMappedFiles einen Unterschied macht, ob sie größer oder kleiner als der verfügbare Hauptspeicher sind. Hab es aber noch nicht selbst ausprobiert, vielleicht komme ich heute abend dazu.
Matthias Hlawatsch 30.09.2013
@Falkner: Solange Du "nur" die Streams in Chunks erzeugst und keine parallele Bearbeitung durchführst, wird sich an der Performance nicht viel ändern. Ich werde versuchen, ein kleines Sample zu bauen und Dir zur Verfügung zu stellen...
ffordermaier 30.09.2013
Vielen Dank f. den Hinweis. Ich hatte tatsächlich fast alle Tests mit 1,33 GB gemaccht, weil ein Testdurchlauf immer viel Zeit kostet. Ich werde ab jetzt m. grösseren files testen! Bin gespannt auf das "Abendergebnis".
Falkner 30.09.2013
@ffordermaier: Sehr nett! Ich freue mich drauf.
Falkner 30.09.2013
@ffordermaier: Sehr nett! Ich freue mich drauf.
Falkner 30.09.2013
Hab ein Beispiel hinzugefügt und meine Erkenntnisse kurz geschildert. HTH.
ffordermaier 01.10.2013
+1 (bug-bedingt leider nur textuell)
Hoffe, ich kann es mal noch nachstellen. Zeit ist leider auch bei mir knapp.
Ich habe mal noch workarounds für den "italic-Bug" in das Code-Beispiel eingefügt (sprich: [i] => \[i]).
Matthias Hlawatsch 01.10.2013
@ffordermaier, @Matthias Hlawatsch: Euch beiden vielen Dank! Ich werde die kommende Woche intensive Tests vornehmen.
Falkner 02.10.2013
@Falkner: Gern geschehen. Ich freu mich schon auf Deine Erkenntnisse.
ffordermaier 02.10.2013
@ffordermaier: Die Methode:

ProcessFileSequentially(string fileName)

läuft fehlerfrei mit den usings:

using System;
using System.Text;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Linq;

Bei den Methoden:

ProcessFileInParallelUsingViewStream(string fileName)
ProcessFileInParallelUsingViewAccessor(string fileName)

unterbricht mein SD
Falkner 02.10.2013
Baust Du Deine Anwendung als x64? Das habe ich auch einstellen müssen, um mit dem MMF mit großen Files zu arbeiten.
ffordermaier 02.10.2013
Achja, sorry, das ich die usings nicht dazugepackt hab :-(
ffordermaier 02.10.2013
Mein SD 4.3 meckert rum, wenn ich es auf x64 umstellen will - wird wohl noch nicht unterstützt. Gibt es da eine Alternative?
Falkner 02.10.2013
Hmm...Visual Studio? Oder von der CommandLine manuell mit csc bauen. Falls SD Projekte MSBuild-Skripte sind, kannst Du es auch dort manuell ändern und mit msbuild von der CommandLine bauen.
ffordermaier 02.10.2013
@Matthias: Jetzt seh ichs erst. Danke fürs Italic-Bugfixing :)
ffordermaier 02.10.2013
@ffordermaier: "Hmm...Visual Studio?" - Hmm...(kommentarlos) nein! Aber schon in der Schlagwortzeile hatte ich auf die Nutzung v. SD 4.3 hingewiesen. Ich habe so einige schöne Ansätze bekommen u. werde ab Mo. alles mal so durchtesten. Das kann 1-2 Wo. dauern - ein result wird es aber in jedem Fall hier geben.
Falkner 03.10.2013
@ffordermaier:Ich habe meiner Lösung ein Update zugefügt.
Falkner 17.10.2013
2
Ich habe mir mal den Spaß gemacht und ffordermaiers Code ausprobiert (i5 3570K, 16 GB RAM, 256 GB OCZ Vector SSD). Mit einer 6,6GB-Datei kam ich auf vergleichbare Resultate (25-30s für ProcessFileInParallelUsingViewStream, 45-50s für die anderen). Mit der 5fachen Dateigröße hingegen sah die Sache schon anders aus: jeweils ca. 13 Minuten für die beiden parallen Versionen (die sequentielle hab ich da aus Zeitgründen nicht laufen lassen).

Dazu habe ich aber auch noch zwei Varianten ausprobiert, die CreateViewAccessor "stückweise" benutzt haben - und die liefen mit der 33GB-Datei deutlich schneller, nämlich 3:09m für ProcessFileInParallelUsingViewAccessor2 und 3:50m für ProcessFileInParallelUsingViewAccessor2. (Mit der "kleinen" Datei waren sie beide ein klein wenig langsamer als die Stream-Version.) Hier der Code, möglicherweise noch fehlerbehaftet und sicher mit Verbesserungspotential - ich wollte nur schnell die Idee ausprobieren:

private static void ProcessFileInParallelUsingViewAccessor2(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

using (var mmf = MemoryMappedFile.CreateFromFile(fileName))
{
Parallel.ForEach(
Partitioner.Create(0, fileSize, chunkSize),
() => mmf,
(range, state, l, obj) =>
{
using (var accessor = obj.CreateViewAccessor(range.Item1, range.Item2 - range.Item1))
{
byte[] data = new byte[chunkSize];
var currentChunkSize = (int)(range.Item2 - range.Item1);

accessor.ReadArray(0, data, 0, currentChunkSize);

for (int i = 0; i < currentChunkSize; i++)
{
data[i] = (byte)(Byte.MaxValue - data[i]); // pseudo manipulation
}

accessor.WriteArray(0, data, 0, currentChunkSize);
}

return obj;
},
obj => { });
}
}

private static void ProcessFileInParallelUsingViewAccessor3(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

using (var mmf = MemoryMappedFile.CreateFromFile(fileName))
{
Parallel.ForEach(
Partitioner.Create(0, fileSize, 1024 * 1024 * 1024),
() => mmf,
(range, state, l, obj) =>
{
using (var accessor = obj.CreateViewAccessor(range.Item1, range.Item2 - range.Item1))
{
byte[] data = new byte[chunkSize];

for (long i = 0; i < range.Item2 - range.Item1; i += chunkSize)
{
accessor.ReadArray(i, data, 0, chunkSize);

for (int j = 0; j < chunkSize; j++)
{
data[j] = (byte)(Byte.MaxValue - data[j]); // pseudo manipulation
}

accessor.WriteArray(0, data, 0, chunkSize);
}
}

return obj;
},
obj => { });
}
}


(Ach ja: wenn man mit diesen Dateigrößen arbeitet, sollte man die Ausgabe in der Measure-Methode um die Minuten ergänzen...)

Auf Anregung von ffordermaier bekommt dieser ohnehin schon rekordverdächtig lange Thread nun noch ein Update:
Ich habe den selben Ansatz - jede Partition erzeugt sich ihre eigene View, statt dass alle mit derselben arbeiten - nun auch noch auf die ParallelViewStream-Variante übertragen, und das war nochmal schneller. Meine Vermutung ist, dass dadurch, dass die chunks ja jeweils sequentiell verarbeitet werden und Neupositionierungen des Streams vergleichsweise selten erfolgen, der Stream gegenüber dem Accessor doch im Vorteil ist. Letzterer scheint wohl eher dafür gemacht zu sein, in komplett willkürlicher Reihenfolge auf die Daten zuzugreifen. Ob Variante 2 oder 3 schneller ist, scheint sowohl mit Stream als auch mit Accessor von der Dateigröße abzuhängen - und ich vermute, die Hardware und die Rechenzeit für die eigentliche Verarbeitung spielen auch noch eine Rolle.

Hier die Zeiten für einen Durchlauf mit einer 6,6GB-Datei:

Processing sequentially...
Execution took 0:27m.
Processing in parallel using view stream...
Execution took 0:18m.
Processing in parallel using view stream 2...
Execution took 0:13m.
Processing in parallel using view stream 3...
Execution took 0:16m.
Processing in parallel using view accessor...
Execution took 0:44m.
Processing in parallel using view accessor 2...
Execution took 0:30m.
Processing in parallel using view accessor 3...
Execution took 0:28m.

Und hier mit einer 33GB-Datei (da habe ich nur noch die schnellsten Kandidaten antreten lassen):
Processing in parallel using view stream 2...
Execution took 2:24m.
Processing in parallel using view stream 3...
Execution took 2:09m.
Processing in parallel using view accessor 2...
Execution took 3:00m.
Processing in parallel using view accessor 3...
Execution took 2:31m.

Reichlich 2min für 33GB - das heißt kontinuierlich und parallel je 250MB/s lesen und schreiben. Ich glaube, mehr gibt meine SSD gar nicht her.

Noch eine andere Beobachtung: getestet habe ich mit der AnyCPU-Konfig. Die beiden Process...2-Methoden liefen (mit der 6,6GB-Datei) aber auch als 32Bit-Anwendung. Die Stream-Version war dabei auch genauso schnell, die Accessor-Version hat hingegen fast doppelt so lange gebraucht. Die *3-Methoden waren da heikler. Nach einer Reduzierung der View-Größe von 1GB auf 64MB kam die Stream-Version durch, die Accessor-Version hatte selbst dann noch eine Speicher-Exception.

Hier als Referenz noch der Quellcode:
private static void ProcessFileInParallelUsingViewStream2(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

using (var mmf = MemoryMappedFile.CreateFromFile(fileName))
{
Parallel.ForEach(
Partitioner.Create(0, fileSize, chunkSize),
() => mmf,
(range, state, l, obj) =>
{
using (var stream = obj.CreateViewStream(range.Item1, range.Item2 - range.Item1))
{
byte[] data = new byte[chunkSize];
var currentChunkSize = (int)(range.Item2 - range.Item1);

stream.Read(data, 0, currentChunkSize);

for (int i = 0; i < currentChunkSize; i++)
data[i] = (byte)(Byte.MaxValue - data[i]); // pseudo manipulation

stream.Position = 0;
stream.Write(data, 0, currentChunkSize);
}

return obj;
},
obj => { });
}
}

private static void ProcessFileInParallelUsingViewStream3(string fileName)
{
var fi = new FileInfo(fileName);
long fileSize = fi.Length;

using (var mmf = MemoryMappedFile.CreateFromFile(fileName))
{
Parallel.ForEach(
Partitioner.Create(0, fileSize, 1024 * 1024 * 1024),
() => mmf,
(range, state, l, obj) =>
{
using (var stream = obj.CreateViewStream(range.Item1, range.Item2 - range.Item1))
{
byte[] data = new byte[chunkSize];

for (long i = 0; i < range.Item2 - range.Item1; i += chunkSize)
{
var currentChunkSize = (int)Math.Min(range.Item2 - range.Item1 - i, chunkSize);

stream.Read(data, 0, currentChunkSize);

for (int j = 0; j < currentChunkSize; j++)
data[j] = (byte)(Byte.MaxValue - data[j]); // pseudo manipulation

stream.Position = i;
stream.Write(data, 0, currentChunkSize);
}
}

return obj;
},
obj => { });
}
}
07.10.2013
Matthias Hlawatsch 13,2k 4 9
Zuerst einaml Dank f. d. Info, wie FS eingesetzt wurde! Ich bin ohnehin durch SD 4.3 eingeschränkt, was diese spez. Lösung betrifft - leider! Allerdings habe ich noch weitere Lösungsansätze gefunden, die erheblichen Geschwindigkeitszuwachs f. bspw. auch FS beinhalten könnten. Ich muss das aber erst genauer probieren (bei kleinen files, so etwa 2 G, konnte ich die Zeit schon mal auf 1/3 reduzieren). Ich werde heute den Testaufbau m. versch. Ansätzen aufbauen. Bis zur Veröffentlichung kann es aber ev. etwas noch dauern.
Falkner 07.10.2013
Kannst Du (vielleicht sogar in Form einer eigenen Frage hier bei codekicker) die Einschränkungen darstellen, denen Du Dich durch SharpDevelop ausgesetzt siehst? Ich kann mir eigentlich nicht vorstellen, daß irgendeine ernstzunehmende .NET-IDE Probleme mit diesem plain vanilla .NET code machen sollte.
Matthias Hlawatsch 07.10.2013
Sicherlich könnte ich das machen, aber über sehr viele Einschränkswungen bin ich schon informiert. Da gibt es doch sehr viele (bspw. math. Bereich usw.).

ZU deinem Code: "ProcessFileInParallelUsingViewAccessor3" läuft zwar - aber nicht immer. "ProcessFileInParallelUsingViewAccessor2" unterbricht noch öfter. Allerdings stellte auch ffordermaier schon fest, dass er auf x64 umstellen musste - das ist aber bei meinem SD zwar möglich, aber es rebelliert, wenn diese Einstellung gesetzt wurde. Der Testaufbau ist aber auch so schon fortgeschritten.
Falkner 07.10.2013
@Matthias: Cool, dass Du es noch mit weiteren Dateigrößen versucht hast. Sehr aufschlussreich. Hast Dues auch mit dem ViewStream versucht? Der hat bei meinen Tests besser abgeschnitten.
ffordermaier 07.10.2013
@Florian: ja, nur ProcessFileSequentially habe ich weggelassen. Deine beiden ProcessFileInParallel* kamen wie gesagt beide so bei 13min +/- 10s raus. Also ca. die 25fache Zeit für die 5fache Größe...
Matthias Hlawatsch 07.10.2013
@Falkner Bei mir laufen bislang beide stabil. Und grad eben war die 3er-Version sogar deutlich schneller mit 2:30m vs. 3:18m. Dafür aber auch sehr viel speicherhungriger während der Laufzeit.

Bei mir funzt übrigens auch die "Any CPU"-Variante (ohne den Haken bei "Prefer 32bit" in VS 2012). Man darf dann nur nicht den Fehler machen, die Anwendung von einem 32bit-Prozess hosten zu lassen (z.B. Visual Studio...), sonst läuft sie natürlich als 32bit. Wobei eine reine 64bit-Konfig schon gerechtfertigt ist, denn um ein 150GB-File auf virtual memory zu mappen, braucht man nunmal 64bit-Adressen.
Matthias Hlawatsch 07.10.2013
Obwohl ich heute sehr viel testen wollte, habe ich zeitlich nur begrenzt testen können, aber ich hatte ja schon erwähnt, dass ein result etwas dauern kann. Bei mir steht mom. "CreateViewAccessor" sehr hoch im Kurs; den ViewStream werde ich aber auf jeden Fall weiter verfolgen. Meine Testdateien bestehen jetzt auch nicht mehr aus irgendwelchen Daten, sondern nur noch aus einem einzigen Zeichen, welches durchgehend wiederholt bis an das Dateiende geschrieben wird.
Falkner 07.10.2013
Sorry, hatte vergessen darauf zu antworten: Bei mir läuft nur die folgende Einstellung richtig (keine Warnungen u. keine Fehler):

AnyCPU
32-bit Intel-kompatibler Prozessor

Ich nutze Wib7
Falkner 07.10.2013
@Matthias. Sorry, hab mich wohl falsch ausgedrückt. Ich meinte, ob Du Deine optimierte Variante (aus diesem Post) auch mal mit ViewStream laufen lassen hast lassen? Würde mich schon interessieren.
ffordermaier 08.10.2013
@Florian: Jetzt hab ich's verstanden :-) Nein, noch nicht. Muß irgendwie übersehen haben, daß es für CreateViewStream auch eine Überladung gibt, mit der sich ein "Fenster" definieren läßt. Kann ich aber noch nachholen, dürfte nicht allzu schwer sein.
Matthias Hlawatsch 08.10.2013
@Florian: Habe den gewünschten Test nachgeholt - siehe das Update meiner Antwort.
Matthias Hlawatsch 12.10.2013
@Matthias: Danke für die Tests. Aus dieser ganzen Frage hab ich Einiges mitgenommen. Mir hats Spass gemacht und @Falkner scheint mit seiner erreichten Lösung auch sehr zufrieden zu sein. Tolle Sache.
ffordermaier 14.10.2013
@Matthias Hlawatsch: Ich habe meiner Lösung ein Update zugefügt.
Falkner 17.10.2013
0
http://www.uggaustraliaoutlet.in.net/
http://www.canadagooseoutlet.cc/
http://www.adidasshoe.us.com/
http://www.yeezyboost.us.com/
http://www.cheap-raybans.us.com/
http://www.yeezyboost-350.us.com/
http://www.christianlouboutinoutlet.us/
http://www.ralphlaurenoutlet.us.org/
http://www.uggsandals.in.net/
http://www.guccihandbagsoutlet.us.com/
http://www.canadagoosejacketssale.com.co/
http://www.coachoutletstoreonline.com.co/
http://www.officialcoachoutlet.us.com/
http://www.adidasnmd-shoes.us/
http://www.cheapjordans-shoes.us.com/
http://www.katespadehandbagsclearance.us.com/
http://www.michaelkorshandbags-outlet.us.org/
http://www.mulberry-bags.me.uk/
http://www.longchamp-outlet.us.com/
http://www.timberlandbootsoutlets.us.com/
http://www.toryburchoutletonline.com.co/
http://www.catboots.us/
http://www.michaelkors-outlet.ca/
http://www.coachoutletstoreonlineclearances.in.net/
http://www.canadagoosesoutlet.ca/
http://www.northface-jackets.us.com/
http://www.pandora-charms.us.org/
http://www.uggsbootscanada.ca/
http://www.cheapuggsale.in.net/
http://www.valentinoshoesoutlets.us.com/
http://www.oakley--sunglasses.us.org/
http://www.cheapraybansunglassessale.us.com/
http://www.jacketscanadagoose.org.uk/
http://www.toryburchoutletonlines.us.com/
http://www.outletmichaelkorsonline.us.com/
http://www.uggs.in.net/
http://www.ralph-laurenuk.org.uk/
http://www.uggsbootsonline.us.com/
http://www.guccioutlets.us.org/
http://www.nikeoutlet.us.com/
http://www.uggbootssale.me.uk/
http://www.pandorajewelryoutlet.in.net/
http://www.jacketscanadagoose.com.co/
http://www.coachfactory-outlet.us.com/
http://www.northfacejacketssale.us.com/
http://www.michaelkorsoutletonlineclearance.in.net/
http://www.coach-factoryoutlet-online.us.com/
http://www.ultraboost.us/
http://www.uggoutlet.cc/
http://www.ralph-laurenuk.co.uk/
http://www.uggsoutletclearance.com.co/
http://www.canadagoosesalejackets.us.com/
http://www.nikeshoes.us.com/
http://www.uggsoutlets.com.co/
http://www.coachcanadaoutlet.ca/
http://www.pandora-outlet.us.com/
http://www.adidas-shoes.us.com/
http://www.ugg-boots.net.co/
http://www.uggs-clearance.us.com/
http://www.nikeoutletonline.us.com/
http://www.uggs-outlets.com.co/
http://www.cheapoakleysunglassesofficial.us.com/
http://www.michael-korshandbags.me.uk/
http://www.cheapraybans.com.co/
http://www.outletlouisvuitton.us.com/
http://www.uggoutlet-clearance.us.com/
http://www.uggsoutlets.in.net/
http://www.coachoutlet-onlinesale.us.com/
http://www.pandoracharmssaleclearance.uk/
http://www.redbottomsshoes.us.com/
http://www.ralphlaurenuk.me.uk/
http://www.raybansunglassessales.us.com/
http://www.uggsoutletclearance.us.com/
http://www.goosecanadaoutlet.us.com/
http://www.coach-outletonlines.us.com/
http://www.pandoracharms.us.com/
http://www.yeezyboost-350.co.uk/
http://www.ugg.in.net/
http://www.moncler-uk.me.uk/
http://www.michaelkorsoutletonlinemichaelkors.us.com/
http://www.supremenewyork.us.com/
http://www.moncler-outlets.us.com/
http://www.canadagoosejacketscanada.org.uk/
http://www.adadassuperstar.com/
http://www.ralphlaurensaleclearance.me.uk/
http://www.ralphlaurenoutletonline-polo.us.com/
http://www.ugg-slippers.us.com/
http://www.burberryoutlet.in.net/
http://www.michaelkorsfactoryoutletsale.us.com/
http://www.nikeairmax.in.net/
http://www.louisvuitton-outletonline.us.com/
http://www.uggbootssales.us.com/
http://www.cheapuggssale.com.co/
http://www.cheapjerseyswholesalefromchina.us.com/
http://www.cheapjordans.in.net/
http://www.airmax-2018.com/
http://www.coachoutlet-online.us.org/
http://canadagoose.jacketsoutlet.us.com/
http://www.monclerjacketssale.us.com/
http://www.ralphlaurenoutlet.in.net/
http://www.burberry-outlet-canada.ca/
http://www.coach-outletonline.us.org/
http://www.cheap-uggboots.net.co/
http://www.nfljerseyscheapwholesale.us.com/
http://www.ugg-outlet.com.co/
http://www.poloralphlaurenralph.us.com/
http://www.michael-kors.us.org/
http://www.air-jordans.us.com/
http://www.northfacejacketsoutlet.com.co/
http://www.nikeshoes.in.net/
http://www.canadagooseukcanada.co.uk/
http://ugg.bootsoutlet.us.com/
http://www.canadagooseoutletgoods.com/
http://www.katespade.in.net/
http://www.polooutlets.us.org/
http://www.adidas-nmd.us.com/
http://www.coach-outlets.us.com/
http://www.coachoutlets.us.org/
http://www.canadagoosejacketscanada.ca/
http://www.uggs-outlets.in.net/
http://www.hermes.us.org/
http://www.adidasnmd.us.org/
http://www.airjordanshoes.in.net/
http://www.adidas-yeezyshoes.us.com/
http://www.burberryoutletonlines.us.com/
http://www.canadagooseoutletjackets.us.com/
http://www.michaelkorsoutletstoreonline.us.org/
http://www.tomsoutlets.us.com/
http://www.jordanretro.name/
http://www.uggoutlet-onlines.us.com/
http://www.supremeclothing.us.org/
http://www.michaelkorsoutletclearance.in.net/
http://www.pandoracharms.name/
http://www.burberry.us.com/
http://www.2017nikeairmax.us/
http://www.nike-store.us.com/
http://www.mlbjerseyscheap.us.com/
http://www.uggsaustraliaoutlet.us.com/
http://www.coachoutletcoachfactoryoutletonline.us.com/
http://www.canadagoose-outlet.name/
http://www.adidas-superstar.us.com/
http://www.nikecortez.in.net/
http://www.canadagoosejacket.com.co/
http://www.hermesbirkin.in.net/
http://www.michaelkorsoutlet.co.uk/
http://www.nikehuaracheshoes.in.net/
http://www.adidasoutlet.us.com/
http://www.cheapjordan-shoes.in.net/
http://www.canadagoosejacketscanada.com.co/
http://www.uggoutlets.us.org/
http://www.coachoutletonlinecoachfactoryoutlet.us.com/
http://www.moncleroutlets.us.org/
http://www.coachoutletcanada.ca/
http://www.vuittonlouis.us.com/
http://www.ralphlauren-outletpolo.us.com/
http://www.raybans.org.uk/
http://www.hermesbag.us.com/
http://www.uggs-australia.it/
http://www.uggbootsclearance.com.co/
http://www.mulberryoutlet.org.uk/
http://www.coachfactoryoutlet-storeonline.us.com/
http://www.canadagoosesaleoutlet.us.com/
http://www.fredperrypoloshirts.us/
http://www.coach-factoryoutletonline.us.org/
http://www.coach-outlet.in.net/
http://www.louboutinshoes.in.net/
http://www.canadagooseoutletjackets.ca/
http://www.adidasyeezyshoes.us.com/
http://www.uggsoutlets.us.org/
http://www.ferragamo-outlet.us.com/
http://www.ralph-laurenoutlet.com.co/
http://www.uggaustraliaoutlet.com.co/
http://www.timberland-outlets.us/
http://www.katespadeonlineoutlet.us.com/
http://www.uggs--canada.ca/
http://www.cheapoakleysunglasses.com.co/
http://www.pandora-jewelryoutlet.us.com/
http://www.salvatoreferragamoshoes.us.com/
http://www.uggs-outlet.net.co/
http://www.canadagooseoutletjackets.com.co/
http://www.coachfactoryonlineoutlet.com.co/
http://www.michael-korsoutlet.us.com/
http://www.christianlouboutinshoes.us.org/
http://www.oakley.nom.co/
http://www.canadagooseoutlet.name/
http://www.coachhandbagsoutlet.us.com/
http://www.uggbootsonsale.com.co/
http://www.canadagooseoutletcanada.com.co/
http://www.cheapjordans.com.co/
http://www.ralphlaurenoutletsale.us.com/
http://www.michael-korsoutlet.ca/
http://www.canadiangoose.us.com/
http://www.nikeoutlet.in.net/
http://www.coachoutletus.us.com/
http://www.monclerjacketssale.co.uk/
http://www.uggoutlet.net.co/
http://www.uggs-boots.fr/
http://www.monclerjacketsoutlet.in.net/
http://www.thenorthface.us.com/
http://www.discountraybansunglasses.us.com/
http://www.columbiasportswear.us.com/
http://www.pandora.us.com/
http://www.michaelkors-handbags.us.org/
http://www.coachfactoryoutletsonlines.us.com/
http://www.louisvuittonoutlet.us.org/
http://www.ugg-uk.org.uk/
http://www.jameshardenshoes.us.com/
http://www.michaelkorsoutlets.us.com/
http://www.doudounemonclerpascher.fr/
http://www.toms.in.net/
http://www.canadagoosejackets.net.co/
http://www.coachoutlets.in.net/
http://www.canadagooseoutlet.net.co/
http://www.uggsale.us.com/
http://www.coachfactory-outletstore.us.com/
http://www.kate-spade.us.com/
http://www.uggsaustralia.fr/
http://www.cheap-uggsboots.us.com/
http://www.poloralphlaurenoutletonline.us.com/
http://www.cheapuggboots.us.com/
http://www.longchampoutletus.us.com/
http://www.uggsonsale.us.com/
http://www.harden-vol1.com/
http://www.ugg-boots.org.uk/
http://www.canadagooseclothing.us.com/
http://www.uggbootsclearance.org.uk/
http://www.cheapjordanshoes.us.com/
http://www.burberryoutletsale.com.co/
http://www.ugg-boots-outlet.us.com/
http://www.louboutin-shoes.us.com/
http://www.uggs.net.co/
http://www.mbtshoes.name/
http://www.yeezyboost.org.uk/
http://www.uggs-boots.us.org/
http://www.ugg.net.co/
http://www.moncleroutletonlines.us.com/
http://www.polooutlet.in.net/
http://www.coachfactory-outletonline.us.org/
http://www.raybansunglasses.net.co/
http://www.ralphlaurensaleclearance.org.uk/
http://www.fitflopssale.us.com/
http://www.mbtshoes.us.org/
http://www.uggshoes.us.com/
http://www.louisvuitton-outlet.us.com/
http://www.polo-ralphlauren.in.net/
http://www.cheapuggs.in.net/
http://www.tomsshoes.us.com/
http://www.burberryoutlet.cc/
http://www.moncler-outlet.us.com/
http://www.raybanssunglassesoutlet.us.com/
http://www.birkenstocksandals.org.uk/
http://www.monclerjacketsuk.org.uk/
http://www.cheapuggs.net.co/
http://www.cheapuggs.com.co/
http://www.ugg-outletstores.us.com/
http://www.adidas-outlet.us.com/
http://www.thenorthfacejacketsoutlet.us.com/
http://www.supremeclothing.org.uk/
http://www.cheapmlbjerseys.us/
http://www.outletcoachoutlet.us.com/
http://www.red-bottoms.us.com/
http://www.uggcanadaboots.ca/
http://www.korsmichaeloutlet.us.com/
http://www.cheapjordanssale.us.com/
http://www.hermes-handbags.us/
http://www.pandora-uk.me.uk/
http://www.christianlouboutinsale.us.org/
http://www.moncleroutlet.me.uk/
http://www.airjordans.us.com/
http://www.northfaceoutlet.us.com/
http://www.uggoutlets.in.net/
http://www.birkenstocks.us/
http://www.pandoracharms.com.co/
http://www.uggsboots-outlet.com.co/
http://www.coach-factory-outlet.us.org/
http://www.longchamphandbagsuk.org.uk/
http://www.coachoutletsonlines.us.com/
http://www.cheapuggboots.com.co/
http://www.ralphlaurenoutlet-polo.us.com/
31.10.2017
0
20171115lck
http://www.adidas-uk.me.uk/
http://www.mulberryhandbagssale.me.uk/
http://www.niketrainers-uk.org.uk/
http://www.pradahandbagsuk.co.uk/
http://www.truereligionjeansclearance.us.com/
http://www.michaelkorsoutletonline-stores.us.com/
http://www.truereligion-jean.us.com/
http://www.coach-handbags.us.com/
http://www.canadagoosecoats.org.uk/
http://www.coachfactoryoutletcoachoutlet.us.com/
http://www.airmax90uk.co.uk/
http://www.cheapjordansonline.us.com/
http://www.toryburchoutletonlinestore.us.com/
http://www.adidasnmduk.org.uk/
http://www.coach-factoryoutlets.us.com/
http://www.michaelkorsoutletonline-shop.us.com/
http://www.nikestore-uk.org.uk/
http://www.airhuaracheuk.org.uk/
http://www.christianlouboutin-outlet.me.uk/
http://www.coach-outletonlinesale.us.com/
http://www.cheapjordan-shoes.us.com/
http://www.michaelkorshandbagsclearancestore.us.com/
http://www.mont-blancpens.com.co/
http://www.clearancefitflopssale.com/
http://www.toryburch-outletstore.in.net/
http://www.reeboktrainers.me.uk/
http://www.oakleysunglassesoutlet-online.us.com/
http://www.pradaoutlet.us/
http://www.michaelkorsoutletkors.us.com/
http://www.toryburch.com.co/
http://www.coachcanada-outlet.ca/
http://www.canadagoosejacketscanagagooseoutlet.us.com/
http://www.kobe9elite.us.com/
http://www.katespade-outlets.us.org/
http://www.airjordan4.org/
http://www.sunglassesrayban.org.uk/
http://www.canadagooseblackfriday.us.com/
http://www.airforce1.us.com/
http://www.long-champhandbags.co.uk/
http://www.rayban--sunglasses.co.uk/
http://www.ralphlaurenpolo.us.com/
http://www.nikerosherun.me.uk/
http://www.outlettruereligion.in.net/
http://www.poloralphlaurens.me.uk/
http://www.oakley-sunglasses.nom.co/
http://www.christianlouboutin-outlet.us.org/
http://www.todsoutlet.us.org/
http://www.uggoutlet-stores.com.co/
http://www.uggboots-online.us.com/
http://www.coach-onlineoutlet.us.com/
http://www.polooutletfactorystore.us.com/
http://www.coachoutletonlineclearance.us.com/
http://www.michael-korsoutletuk.me.uk/
http://www.christianlouboutinonline.us.com/
http://www.uggoutletsale.us.com/
http://www.canadagooseoutletofficial.name/
http://www.coachoutletonline.us.org/
http://www.christian-louboutinshoes.us.org/
http://www.uggsoutletstore.com.co/
http://www.newbalanceshoes.in.net/
http://www.cheapraybansunglasses-wholesale.us.com/
http://www.long-champsolde.fr/
http://www.ferragamo-outlets.us.com/
http://www.jordanshoes.us.com/
http://www.nikeairmax90.nl/
http://www.wholesaleraybansunglasses.us.com/
http://www.cheap-nfljerseyschina.us.com/
http://www.canada--goosejackets.ca/
http://www.coachoutletonline-clearance.us.com/
http://www.coachfactoryoutletstore.com.co/
http://www.montblancpenss.us.com/
http://www.michaelkorsoutletme.us.com/
http://www.pumaoutlet-online.com/
http://www.michaelkors.eu.com/
http://www.thomassabocharms.me.uk/
http://www.ralphlauren-poloshirts.org.uk/
http://www.true-religionjeanssale.us.com/
http://www.truereligion-jeanssale.us.com/
http://www.mbt-shoesoutlet.us.com/
http://www.cheapnba-jerseys.us.com/
http://www.canada--goose.ca/
http://www.burberryoutlet.ca/
http://www.eccoshoesoutlet.us.com/
http://www.uggoutlets-store.us.com/
http://www.fitflopssale.me.uk/
http://www.uggoutletonsale.us.com/
http://www.swarovskicrystaluk.me.uk/
http://www.coachoutlet-onlines.us.com/
http://www.raybansunglasseshut.us.com/
http://www.canadagoose-outlet.us.org/
http://www.monclerjacketsuksale.co.uk/
http://www.uggoutletsstore.us.com/
http://www.christianlouboutin-shoes.me.uk/
http://www.canadagoosejacketssale.co.uk/
http://www.truereligionjeanssale.com/
http://www.niketrainersnikeshoes.co.uk/
http://www.michaelkorshandbags.in.net/
http://www.cheapsnapbacks.net/
http://www.coachoutletclearanceonline.us.com/
http://www.pradashoesofficial.us/
http://www.cheap-uggsoutlet.us.com/
http://www.uggbootscybermonday.us.com/
http://www.truereligion-jeansoutlet.us.com/
http://www.soccerjerseys.us.com/
http://www.michaelkorswallets.us.org/
http://www.nikeairmaxtrainers.co.uk/
http://www.canadagooseoutlet-online.com.co/
http://www.uggbootsclearances.us.com/
http://www.jordan-shoes.us.com/
http://www.michaelkorsoutletfactorystore.us.com/
http://www.christianlouboutin-outletsale.us.com/
http://www.canadagoose-outlet.ca/
http://www.oakleysunglassescheapsale.us.com/
http://www.oakleysunglassescheapwholesale.us.com/
http://www.pandorajewelrys.us.org/
http://www.uggboots-australia.us.com/
http://www.christianlouboutinoutletsale.us.com/
http://www.nikeoutlets.us.org/
http://www.uggoutletsale.us.org/
http://www.michael-korsoutletuk.org.uk/
http://www.pandoracharms-saleclearance.org.uk/
http://www.ray-bansunglassesofficial.us.com/
http://www.ralphlaurenoutlet.org.uk/
http://www.asics-shoes.us.com/
http://www.ferragamooutletstore.us.com/
http://www.canadagooseoutletstore.ca/
http://www.uggoutletclearance.us.com/
http://www.cheapmlbjerseys.net/
http://www.michaelkorshandbagsoutletstores.us.com/
http://www.futbol-baratas.com/
http://www.handbagslongchamp.us.com/
http://www.nfljerseyss.us.com/
http://www.footballshirts.me.uk/
http://www.moncler.us.com/
http://www.poloralph-lauren.us.com/
http://www.maccosmeticsoutlet.us.com/
http://www.fitflopssaleclearance.in.net/
http://www.michaelkorsoutletclearancer.us.com/
http://www.canadagoosejackets-uk.org.uk/
http://www.canadagoose-jackets.org.uk/
http://www.uggoutletcheap.us.com/
http://www.hermesoutletstore.us.com/
http://www.raybans-sunglasses.us.com/
http://www.michaelkors-handbagsuk.me.uk/
http://www.michaelkorsukhandbags.co.uk/
http://www.raybanscheap.us.com/
http://www.coachoutletcoachfactoryoutlet.us.com/
http://www.basketballshoes.us.com/
http://www.vans-shoes.cc/
http://www.ugg-outletonlineclearance.us.com/
http://www.uggsoutlet-stores.us.com/
http://www.airmax-trainers.co.uk/
http://www.michaelkorsoutletclearanceinc.us.com/
http://www.nikeshoes-outlet.us.com/
http://www.pandoracharmssale-clearance.com/
http://www.canadagoose-jackets.com.co/
http://www.raybansunglassescheapsale.us.com/
http://www.nfljerseysofficial.us.com/
http://www.canadagooseoutlet-online.com/
http://www.longchampoutlet1.us.com/
http://www.oakleysunglasseswholesalestore.us.com/
http://www.uggsoutletscheap.us.com/
http://www.canadagooseoutletcanadagoosejackets.com/
http://www.bottega-venetaoutlet.us/
http://www.salomonshoessalomonoutlet.us.com/
http://www.coachoutlet-store.us.org/
http://www.nikefree5.us/
http://www.coachoutletcoupons.us.com/
http://www.uggoutletshop.us.com/
http://www.uggoutlet.ca/
http://www.oakleysunglasses-uk.org.uk/
http://www.michaelkorsbagss.co.uk/
http://www.coachhandbagsclearance.us.com/
http://www.canadagooseoutletstore.name/
http://www.poloralphlaurenoutlet-online.us.com/
http://www.oakleysunglassesoutletcheap.us.com/
http://www.nikeshoesforwomen.us.com/
http://www.linksoflondon.org.uk/
http://www.michaelkors-outletonlineclearance.us.com/
http://www.katespadeoutletonlinestore.us.com/
http://www.michaelkorsfactoryoutletonline.in.net/
http://www.coachoutletcanada.com.co/
http://www.monclerjacketsuk.co.uk/
http://www.valentinooutlet.us.com/
http://www.canadagooseoutletstores.name/
http://www.coachoutletstores.eu.com/
http://www.fitflop.in.net/
http://www.uggcybermonday.us.com/
http://www.oakleysunglasseswholesalechina.us.com/
http://www.pandorajewelryoutlet.us.com/
http://www.canadagoose-outletstores.com.co/
http://www.canadagoose-jackets.co.uk/
http://www.coachoutletstoreonlineclearance.us.com/
http://www.ralphlaurenpoloshirt.us.com/
http://www.kobeshoes.us/
http://www.oakleysunglassesoutletsale.us.com/
http://www.longchamphandbagssale.us.com/
http://www.cheapoakleysunglassesformen.us.com/
http://www.michaelkorsoutletfriday.us.com/
http://www.true-religion.org.uk/
http://www.coachoutletonline-factory.us.com/
http://www.adidas-wings.in.net/
http://www.toryburchoutletofficial.us.com/
http://www.truereligionoutlet-store.us.com/
http://www.hermesbelts.us.com/
http://www.coachfactoryoutletclearance.us.com/
http://www.poloralphlaurenfactorystore.org.uk/
http://www.canadagoose-jackets.us.org/
http://www.uggsboots.ca/
http://oakley.sunglassess.us.com/
http://www.chromeheartsoutlet.com.co/
http://www.canadagooseparka.name/
http://www.moncler.us.org/
http://www.ralphlaurenpolo.eu.com/
http://www.moncleroutletonline.us.com/
http://www.canadagooseoutletclearance.us.com/
http://www.longchampoutlet.us.com/
http://www.coachoutletonlinecoachoutlet.us.com/
http://www.toryburchoutletclearance.us.com/
http://www.michaelkorshandbags-onsale.us.com/
http://www.mulberrysaleuk.org.uk/
http://www.adidasoutletstore.in.net/
http://www.poloralphlauren-outlets.us.com/
http://www.katespadesoutletonlinestore.us.com/
http://www.ralphlauren-outletuk.co.uk/
http://www.uggbootsblackfridays.us.com/
http://www.coachoutletoutlet.us.com/
http://www.reebokoutletstores.us.com/
http://www.ralphlauren-pascher.fr/
http://www.suprashoes.us.com/
http://mulberryoutlet.outlet-store.co.uk/
http://www.oakleysunglasseswholesaleauthentic.us.com/
http://www.burberryoutletstore.in.net/
http://www.polo-lacostepascher.fr/
http://www.louboutin-shoes.org.uk/
http://www.uggoutletstoresofficial.us.com/
http://www.jordanshoesclearance.us.com/
http://www.uggoutletonline-clearance.us.com/
http://www.fitflopssale.us/
http://www.nikeairhuaraches.co.uk/
http://www.outletugg-boots.us.com/
http://www.long-champpliage.fr/
http://www.ralphlaurenoutletclearance.us.com/
http://www.uggboots-outletonline.us.com/
http://www.michaelkors.de.com/
http://www.cheapjerseyswholesale.org/
http://www.michaelkorsoutletonlinefactory.us.com/
http://www.coach-outletclearance.us.com/
http://www.cheap-jordanshoes.us.com/
http://www.oakleysunglasses-sale.us.com/
http://www.kobebryantshoes.in.net/
http://www.pandoracharmssaleclearances.co.uk/
http://www.uggoutletuggs.us.com/
http://www.salvatore-ferragamo.in.net/
http://www.coachoutletclearance.us.org/
http://www.truereligionjeans-canada.com/
http://www.canadagooseoutletstores.ca/
http://www.katespadeoutletstore.us/
http://www.mulberryhandbags-uk.me.uk/
http://www.raybansunglasses2.us.com/
http://www.truereligionjeansoutlet.co.uk/
http://www.adidasnmdad.us.com/
http://www.lakersjerseys.us.com/
http://www.mulberrybagssale.org.uk/
http://www.mulberrybagsuk.co.uk/
http://www.truereligionjeans.co.uk/
http://www.canadagooseoutlet-stores.com.co/
http://www.fitflopsshoes.in.net/
http://www.michaelkors-outletclearance.us.org/
http://www.mulberryoutlets.org.uk/
http://www.raybansunglasses-outlets.us.com/
http://www.ferragamoshoes.org.uk/
http://www.christianlouboutin-shoes.co.uk/
http://www.nbajerseysnike.us.com/
http://www.michaelkorsfactory-outlets.us.com/
http://www.christianlouboutin-shoes.us.org/
http://www.cheapmlbjerseyss.us.com/
http://www.toryburchoutlets.us.org/
http://www.katespadeoutletonlinestores.us.com/
http://www.uggsoutlet.ca/
http://www.oakleysunglassescheapoutlet.us.com/
http://www.nikeblazerpaschers.fr/
http://www.canadagooseoutlet-stores.com/
http://www.canada-gooseoutletstores.com.co/
http://www.canadagoosejackets.me.uk/
http://www.soccer-shoes.us/
http://www.coach-factoryoutlets.us.org/
http://www.uggoutletauthentic.us.com/
http://www.longchamphand-bags.co.uk/
http://www.hermesoutletonline.us.com/
http://www.longchampsoldes.fr/
http://www.uggoutletofficials.us.com/
http://www.michaelkorsoutletmichaelkorsoutletonline.us.com/
http://www.burberry-outletstore.in.net/
http://www.canada-gooseoutletstore.com/
http://www.ugg-bootsoutlet.us.org/
http://www.coachoutletonline.com.co/
http://www.truereligionoutletclearance.us.com/
http://www.truereligionjeansoutlets.us.com/
http://www.birkenstocksandals.me.uk/
http://www.ugg-outletsstore.us.com/
http://www.birkenstock-outlet.us.com/
http://www.polo-outletstore.us.com/
http://www.yeezyboostoutlet.us.com/
http://www.pradasunglasses.us.com/
http://www.katespadeoutletonlines.us.com/
http://www.michae-kors-outlet.ca/
http://www.cartieroutlets.us.com/
http://www.ralphlaurenpoloshirtss.us.com/
http://www.fredperrypolo-shirts.com/
http://www.swarovski-outlet.us.com/
http://www.swarovskioutletstores.us.com/
http://www.coachoutletonline-coachfactoryoutlet.us.com/
http://www.oakleysunglasseswholesaleoakley.us.com/
http://www.cheapsoccerjersey.net/
http://www.michaelkorsoutletz.us.com/
http://www.michaelkorsoutletonlineofficial.us.com/
http://www.nikeoutletonline.us.org/
http://www.michaelkorsoutletcoupons.us.com/
http://www.polooutletpolo.us.com/
http://www.oakley-sunglasseswholesale.us.com/
http://www.longchamppascher.fr/
http://www.cheapraybansunglasseswholesale.us.com/
http://www.marc-jacobs.us.org/
http://www.uggoutletstoress.us.com/
http://www.nike-airmax2015.us/
http://www.jeanstruereligion.in.net/
http://www.ralphlaurenpolo-outlet.us.com/
http://www.uggoutlets.ca/
http://www.rayban-sunglassesoutlets.us.com/
http://www.swarovski-outlets.us.com/
http://www.canada-gooseoutletstore.com.co/
http://www.toryburchoutletstores.us.org/
http://www.mulberryhandbagsuk.org.uk/
http://www.michaelkorssuk.org.uk/
http://www.uggoutletusa.us.com/
http://www.max1.nl/
http://www.coachoutletsales.us.com/
http://www.vansshoesoutletstore.us.com/
http://www.polooutletonlinestores.us.com/
http://www.canadagoosesoutletstore.com/
http://www.poloralphlaurenofficial.us.com/
http://www.mcmoutletstore.us.org/
http://www.coachoutletcoachoutletonline.us.com/
http://www.raybansunglassesok.us.com/
http://www.fitflopsoutletsale.com/
http://www.uggsoutlet-boots.us.com/
http://www.outletchristianlouboutin.us.com/
http://www.michael-korsoutletclearance.us.org/
http://www.cheapmichaelkors-handbags.us.com/
http://www.michaelkorsofficial.us.com/
http://www.fitflopssale.in.net/
http://www.ralphlaurenpoloshirts.org.uk/
http://www.cheapuggbootsonline.us.com/
http://www.uggoutletonlinestore.us.org/
http://www.uggoutletscheap.us.com/
http://www.canadagoosecybermonday.us.com/
http://www.uggoutletugg.us.com/
http://www.swarovskicrystaluk.org.uk/
http://www.chicagoblackhawksjerseys.us.com/
http://www.coachoutletstore.com.co/
http://www.edhardy.us.com/
http://www.raybansunglassesofficialsite.us.com/
http://www.hermes-birkin.in.net/
http://www.kevindurantshoes.net/
http://www.lacostepoloshirts.us/
http://www.adidastrainersshoes.co.uk/
http://www.uggoutlet-onlineclearance.us.com/
http://www.airmax90.us.com/
http://www.nike-store.org.uk/
http://www.uggoutletuggboots.us.com/
http://www.ferragamo.eu.com/
http://www.michaelkorshandbags-outlets.us.com/
http://www.canadagooseoutletonline.com.co/
http://www.longchamphandbagsuk.me.uk/
http://www.michaelkorsfactoryoutlet.us.org/
http://www.burberrysaleoutlet.us.com/
http://www.michaelkorsoutlet-sale.us.com/
http://www.michaelkorsoutlet-storesofficial.us.com/
http://www.ferragamoshoesofficial.us.com/
http://www.raybansunglasses1.us.com/
http://www.oakleysunglassesformens.us.com/
http://www.uggoutletonlineclearance.us.org/
http://www.michaelkorsblackfridays.us.com/
http://www.coachfactoryoutletsales.us.com/
http://www.ralphlaurenoutletstores.us.com/
http://www.yeezyboost350sale.us.com/
http://www.lebronjamesshoess.us.com/
http://www.coach-factoryoutletclearance.us.com/
http://www.raybansunglassesusa.us.com/
http://www.poloralphlaurens.org.uk/
http://www.coachoutletclearance.us.com/
http://www.canadagooseoutlets.name/
http://www.converseshoes.us.com/
http://www.niketrainers-uk.co.uk/
http://www.michaelkorsoutletmks.us.com/
http://www.ysloutlet.us.com/
http://www.longchampoutletonlines.us.com/
http://www.ralph-laurenpolo.us.com/
http://www.nikerosheone.us/
http://www.michaelkorsoutlet-onlineclearance.us.com/
http://www.cheapnhljerseyss.us.com/
http://www.polo-outletonline.us.com/
http://www.coachoutletonlinecoachfactory-outlet.us.com/
http://www.foampositeshoe.net/
http://www.nhljerseysforsale.us.com/
http://www.uggbootsclearance.us.org/
http://www.cheapoakleysunglassesfactory.us.com/
http://www.airmax90uk.me.uk/
http://www.rayban-sunglassesoutlet.us.com/
http://www.oakleysunglassesusa.us.com/
http://www.nikeairmax-90.org.uk/
http://www.candagooseoutletus.com.co/
http://www.poloralphlaurensale.us.com/
http://www.coach-outletstore.us.org/
http://www.pandorajewelrycharms.in.net/
http://www.raybansunglasses-sales.us.com/
http://www.canadagooseoutletstore.com.co/
http://www.oakleysunglassesofficial.us.com/
http://www.cazaloutlet.us.com/
http://www.christian-louboutinoutletstore.us.com/
http://www.nikefactoryoutlets.us.com/
http://www.uggbootsonsale.us.org/
http://www.hervelegeroutlet.us.com/
http://www.michaelkorsoutlet-uk.me.uk/
http://www.uggblackfridays.us.com/
http://www.oakleysunglassesoakley.us.com/
http://www.uggsoutletuggboots.us.com/
http://www.nikeairmax-90.me.uk/
http://www.fitflopsshoes.me.uk/
http://www.clevelandcavaliers.us.com/
http://www.truereligionjeans.org.uk/
http://www.swarovskioutletstore.us.com/
http://www.ferragamooutletstore.net/
http://www.uggoutletuggsoutlet.us.com/
http://www.cheap-snapbacks.us.com/
http://www.canadagoosesjackets.com.co/
http://www.chromeheartsoutletstore.us.com/
http://www.cheapjordansfreeshipping.us.com/
http://www.coachoutlet-clearance.us.com/
http://www.michaelkorsoutletclearance-online.us.com/
http://www.giuseppe-zanotti-outlet.org/
http://www.toryburchoutlet-online.us.com/
http://www.mulberry-handbagsoutlet.org.uk/
20171115lck
15.11.2017
0
http://www.abercrombiehollister.it/
http://www.longchamp-outlet.in.net/
http://www.nike-roshe-run.me.uk/
http://www.roshe--run.com/
http://www.asics-gellyte.fr/
http://www.katespade-uk.co.uk/
http://www.supra--shoes.com/
http://www.kobe9shoes.net/
http://www.polo--ralphlauren.us/
http://www.coachoutlet-online.in.net/
http://www.nikeair-max.net/
http://www.hermesoutlets.us.org/
http://www.poloralphlaurenoutletsale.us.com/
http://www.cheap-wedding-dresses.org/
http://www.cheapuggboots.in.net/
http://www.uggboots--outlet.us.com/
http://www.moncler.co.nl/
http://www.nike-free-run.fr/
http://www.canadagooses.co.nl/
http://www.marcjacobs.org.uk/
http://www.asicso.com/
http://www.linksoflondon.me.uk/
http://www.katespadeoutlet-onlinestore.us/
http://www.pandora-bracciali.it/
http://www.chiflatiron.cn.com/
http://www.nike-airmax.nl/
http://www.mizunowave.net/
http://www.kobebryantshoes10.com/
http://www.uggs-outlet.in.net/
http://www.michael-kors-borse.it/
http://www.michaeljordan.fr/
http://www.nikerosherun.net/
http://www.michael-korsoutletonline.eu.com/
http://www.uggs-canada.ca/
http://www.uggs-outletboots.in.net/
http://www.beats-by-dre.co.uk/
http://www.replica-watchesuk.co.uk/
http://www.rayban-sunglasses.me.uk/
http://www.moncler--outlet.it/
http://www.ray-ban-sunglasses.mex.com/
http://www.burberryoutlet-store.us.com/
http://www.salomonshoes-outlet.com/
http://www.mont-blanc-pens.in.net/
http://www.timberland.org.uk/
http://www.barbour.us.org/
http://www.fivefingersshoes.org/
http://www.insanityworkout.co.uk/
http://www.cheapuggboots.in.net/
http://www.timberland--boots.com/
http://www.christian--louboutin.net/
http://www.adidasoriginals.org.uk/
http://www.christianlouboutin-outlet.in.net/
http://www.cheapnfljerseyonline.us.com/
http://www.thenorthface-uk.co.uk/
http://www.canadagoose-jacka.se/
http://www.asicstrainers.org.uk/
http://www.giuseppezanotti-outlet.us.com/
http://www.lebronshoes12.net/
http://www.mont-blanc-pens.mex.com/
http://www.michael--kors.org.uk/
http://www.rayban-sunglasses.net.co/
http://www.michaelkorsoutletonlinestore-sale.us.com/
http://www.michael--kors.fr/
http://www.bottegavenetaoutlet.us.com/
http://www.cheap-uggs.in.net/
http://www.monclerjackets.us.org/
http://www.maccosmetics-uk.co.uk/
http://www.karenmillen.org.uk/
http://www.fitflop.me.uk/
http://www.air-jordans.co.uk/
http://www.mulberryhandbagsoutlet.org.uk/
http://www.christian-louboutin-shoes.in.net/
http://www.puma--shoes.com/
http://www.pandorajewelrys.us.com/
http://www.timberland-boots.us/
http://www.oakleysunglassesfree.us.com/
http://www.michael--korsoutlet.ca/
http://www.nikeshoes-outletstore.us/
http://www.rayban--sunglasses.org.uk/
http://www.oakley-vault-sunglasses.mex.com/
http://www.the-north-face.in.net/
http://www.salvatoreferragamo-shoes.us.com/
http://www.balenciaga.in.net/
http://www.omegawatches.org.uk/
http://www.reebok-outlet.in.net/
http://www.toryburch-outletsonline.us.com/
http://www.montre-femme-homme.fr/
http://www.converse.org.uk/
http://www.bracelet-swarovski-bijoux.fr/
http://www.montre--pascher.fr/
http://www.michael-jordan.it/
http://www.hogan-outlet-online.it/
http://www.michael-jordan.co.uk/
http://www.ghd-hairstraighteners.me.uk/
http://www.mizunorunning-shoes.com/
http://www.ray-ban-sunglassesoutlet.us.com/
http://www.ferragamo.org.uk/
http://www.michaelkorsoutletsell.us.com/
http://www.parkacanadagoosepascher.fr/
http://www.sac-longchamp-pas-cher.fr/
2017.11.16xukaimin
16.11.2017
0
http://www.coachoutletonlinestores.eu.com/
http://www.kate-spadehandbags.us.com/
http://www.uggs-outlets.us.org/
http://www.birkenstock.us.com/
http://newyorkjets.jerseyssale.us.com/
http://kansascitychiefs.jerseyssale.us.com/
http://www.coach-outletstore.name/
http://www.michael-korshandbags.uk/
http://www.ralphlaurenoutlet-uk.org.uk/
http://tennesseetitans.jerseyssale.us.com/
http://www.cheapray-banssunglasses.us.com/
http://chargers.jerseyssale.us.com/
http://www.cheapoakleysunglassesforsale.us.com/
http://arizonacardinals.jerseyssale.us.com/
http://www.nikehuarache2017.in.net/
http://www.canadagooseoutlet.ca/
http://www.montblancpensoutlet.us.com/
http://www.polo-ralphlaurenuk.org.uk/
http://www.airjordan-shoes.us.com/
http://www.truereligionoutlet-stores.us.com/
http://www.moncler-outlets.us.org/
http://www.uggsoutletsboots.us.com/
http://www.coachoutletstore-online.eu.com/
http://www.instyler-max.in.net/
http://www.nikerosherunuk.org.uk/
http://cavaliers.jerseyssale.us.com/
http://www.nikehuaraches.org.uk/
http://www.reebokoutlets.in.net/
http://www.jordanshoes.eu.com/
http://www.cheapraybans.net.co/
http://www.kate-spadeoutlets.us/
http://www.pandora-outlet.us.org/
http://www.nikehuarache.org.uk/
http://www.christianlouboutin.in.net/
http://www.oakley-sunglasseswholesale.us.org/
http://www.airjordan4.us.com/
http://www.katespade-outlet.us.org/
http://www.michaelkorsoutletmichaelkorshandbags.us.org/
http://www.airmax2015.in.net/
http://buffalobills.jerseyssale.us.com/
http://www.coachoutletonlinecoachhandbags.us.com/
http://www.basketballshoes.us.org/
http://www.uggsoutletstores.us.org/
http://www.nikeshoes2017.us.com/
http://cincinnatibengals.jerseyssale.us.com/
http://www.raybansunglasses-outlet.net.co/
http://www.coach-outletstoreonline.eu.com/
http://www.katespades.us.com/
http://www.adidasyeezyshoessale.us.com/
http://atlantafalcons.jerseyssale.us.com/
http://houstontexans.jerseyssale.us.com/
http://chicagobulls.jerseyssale.us.com/
http://www.ralph-lauren-polo.us.com/
http://newyorkknicks.jerseyssale.us.com/
http://www.louboutinshoes.us/
http://www.coachoutletonlinecoachoutletstore.us.com/
http://www.eccoshoesoutlet.us/
http://www.uggsoutletssale.us.com/
http://www.jimmy-choo.us.com/
http://www.salomonshoes.us.com/
http://denverbroncos.jerseyssale.us.com/
http://celtics.jerseyssale.us.com/
http://www.fitflopssales-clearance.us.com/
http://newyorkgiants.jerseyssale.us.com/
http://www.handbagscoach.us.com/
http://www.oakleysunglasseswholesalecheap.us.com/
http://baltimoreravens.jerseyssale.us.com/
http://www.michaelkorsoutletstores.cc/
http://www.rolexreplica-watches.com.co/
http://dallascowboys.jerseyssale.us.com/
http://www.christianlouboutinoutlets.us/
http://chicagobears.jerseyssale.us.com/
http://greenbaypackers.jerseyssale.us.com/
http://www.jordan-shoes.us.org/
http://www.michael-kors-outlet.ca/
http://www.cheapnfljerseyswholesales.us.com/
http://www.gucciborseitalia.it/
http://washingtonredskins.jerseyssale.us.com/
http://www.coach-factoryoutlet.org/
http://www.michaelkors-handbags.org.uk/
http://www.raybansunglasses-outlet.com.co/
http://www.poloralph-laurenuk.me.uk/
http://www.raybans.com.co/
http://www.michaelkorsoutletmichaelkorshandbags.us/
http://miamidolphins.jerseyssale.us.com/
http://www.pandorajewelryofficial.us.com/
http://www.michaelkors-handbagssale.us.com/
http://www.coach-outletstoreonline.com.co/
http://www.nbajerseys.us.org/
http://www.uggsoutletsclearance.us.com/
http://www.uggsoutletonlinestore.us.com/
http://www.outletonlinecoach.us.com/
http://www.cheap-oakleysunglasses.us.org/
http://www.poloralphlauren-uk.co.uk/
http://thunder.jerseyssale.us.com/
http://www.niketrainerssale.org.uk/
http://www.nikeoutlet-store.us.com/
http://www.christian-louboutinoutlet.us/
http://www.christianlouboutinoutletstores.us.com/
http://www.michaelkorsoutlethandbags.us.org/
http://miamiheat.jerseyssale.us.com/
http://www.ray-bansunglassesoutlet.net.co/
http://www.todsoutlet.us.com/
http://pittsburghsteelers.jerseyssale.us.com/
http://www.nikefactorystore.us.com/
http://www.niketrainersuk.org.uk/
http://www.cheapnike-shoes.com/
http://www.nikestores.org.uk/
http://www.yeezyboost350.us.org/
http://www.cheap-jordans.us.org/
http://www.prada-shoes.us.com/
http://www.truereligionjeansoutletonline.us.com/
http://www.ralphlaurenpolooutletonline.us.com/
http://www.coachoutletonlinecoachfactoryoutlet.eu.com/
http://seattleseahawks.jerseyssale.us.com/
http://www.factoryoutletcoach.us.org/
http://www.nikeoutlet-stores.us.com/
http://www.ralphlaurenoutlets.co.uk/
http://www.coachoutletfactory-store.us.com/
http://www.armanioutlet.us.com/
http://minnesotavikings.jerseyssale.us.com/
http://www.airmax90.eu.com/
http://www.pandorajewelryoutlets.in.net/
http://www.coachoutletonlines.eu.com/
http://www.ralph-laurenoutlet.in.net/
http://www.michaelkorshandbags.us.org/
http://www.nikeblazers.fr/
http://www.uggoutletforsale.us.com/
http://www.truereligionjeansoutletstores.us.com/
http://www.uggsoutletsboots.us.com/
http://philadelphiaeagles.jerseyssale.us.com/
http://www.uggoutletshoes.us.com/
http://www.oakleysunglasseswholesalea.us.com/
http://www.michaelkors.outlet-online.us.com/
http://www.katespade-handbags.eu.com/
http://oaklandraiders.jerseyssale.us.com/
http://www.ralph-laurenoutlets.us.com/
http://www.edhardyuk.me.uk/
http://www.conversetrainer.org.uk/
http://www.ralphlaurenoutlet-uk.me.uk/
http://www.uggsoutletugg.us.com/
http://clevelandbrowns.jerseyssale.us.com/
http://www.skechersoutlets.us/
http://www.coachfactoryoutletus.us.com/
http://www.michaelkorshandbagsoutlet.co.uk/
http://www.hermes-belt.us.org/
http://www.ferragamoshoes.us.com/
http://www.uggsoutletstores.us.org/
http://www.coachfactoryoutletstoresonline.us.com/
http://www.christian-louboutinuk.co.uk/
http://www.hugobosssale.name/
http://www.snapbacks.us.com/
http://www.cheapray-bans.com.co/
http://www.michaelkorshandbags-uk.me.uk/
http://www.canada-gooseoutlets.com.co/
http://indianapoliscolts.jerseyssale.us.com/
http://www.discount-oakleysunglasses.us.com/
http://www.burberryoutletonlinestore.us.com/
http://www.shoesnike.us.com/
http://www.uggsoutletuggs.us.com/
http://www.coachoutlet-storeonline.com.co/
http://www.airjordanuk.org.uk/
http://www.cheapraybansunglassesrb.us.com/
http://www.airjordan8.us.com/
http://www.niketnpascher2017.fr/
http://detroitlions.jerseyssale.us.com/
http://sanfrancisco49ers.jerseyssale.us.com/
http://www.raybanssunglasses.net.co/
http://www.fitflopssale-clearances.us.com/
http://www.nikeshoesoutlet.us.org/
http://neworleanssaints.jerseyssale.us.com/
http://clippers.jerseyssale.us.com/
http://www.true-religionoutlets.us.com/
http://www.montblancpenoutlet.com.co/
http://carolinapanthers.jerseyssale.us.com/
http://www.nikeoutletstorefactory.com/
http://sanantoniospurs.jerseyssale.us.com/
http://www.pandora-charms.com.co/
http://www.longchamp-outlets.us.com/
http://www.guccioutlets.com.co/
http://www.nikeair-huarache.me.uk/
http://www.oakleysunglasseswholesale.net.co/
http://www.fitflopssale-clearance.us.com/
http://www.polo-outlets.us.com/
http://www.ralph-laurenoutletuk.co.uk/
http://www.christianlouboutinshoescheap.us.com/
http://www.ralph-laurenoutletuk.org.uk/
http://www.uggsoutletsstores.us.com/
http://www.soccer-shoes.us.com/
http://www.edhardyoutlet.name/
http://www.nhljerseyssale.us.com/
http://www.oakleysunglassessales.us.com/
http://lakers.jerseyssale.us.com/
http://www.shoesmbt.us.com/
http://warriors.jerseyssale.us.com/
http://jaguars.jerseyssale.us.com/
http://www.oakleysunglassesoutlete.us.com/
http://newenglandpatriots.jerseyssale.us.com/
http://www.mlb-jerseyscheap.us.com/
http://www.uggsoutletclearance.us.org/
http://www.rayban-sunglassesoutlet.net.co/
http://www.cheap-jordansshoes.us.com/
http://www.coachfactoryoutlet.cn/
http://www.fitflopsclearancesale.us.com/
qzz
vorgestern

Stelle deine .net-Frage jetzt!