@Test
	@Ignore
	public void bigTest() throws Exception {
		int maxObjectSize = 1024;
		int totalObjectCount = 100_000;
		int objectPackSize = totalObjectCount / 10;

		writeStartMessage();

		Storage storage = DirectoryStorage.newStorage(TEST_DIR_NAME);
		long[] ID = new long[totalObjectCount];
		// It is faster to work with storage with packs of objects
		for (int i = 0; i < totalObjectCount; i += objectPackSize) {
			long[] tempID = storage.generateKey(objectPackSize);
			byte[][] objects = generateRandomObjects(maxObjectSize, objectPackSize, tempID);
			storage.write(tempID, objects);
			System.arraycopy(tempID, 0, ID, i, objectPackSize);

			writeObjectsStoredMessage(i + objectPackSize);
		}
		writeFinishStoringObjectsMessage();

		long fullReadingTime = 0;
		for (int i = 0; i < totalObjectCount; i += objectPackSize) {
			long[] randomID = generateRandomID(objectPackSize, ID);

			long startTime = System.nanoTime();
			byte[][] objects = storage.get(randomID);
			fullReadingTime += System.nanoTime() - startTime;

			for (int j = 0; j < objectPackSize; j++) {
				checkObject(objects[j], randomID[j]);
			}

			writeObjectsCheckedMessage(i + objectPackSize);
		}
		writeFinishCheckingObjectsMessage();
		writeFullAndAverageTimeObjectsReading(totalObjectCount, fullReadingTime);

		//0 1 2 3 4 5
		//0 2 4 6 8 10
		//2 4 6 8 10 12
		int removeObjectsCount = 50_000;
		Set<Long> deletedID = new HashSet<>(removeObjectsCount);
		for (int i = 0; i < removeObjectsCount; i += objectPackSize) {
			// Generating random ID's only from part of ID array - to prevent collisions
			long[] IDpart = Arrays.copyOfRange(ID, i * 2, (i + objectPackSize) * 2);
			long[] randomID = generateDifferentRandomID(objectPackSize, IDpart);
			storage.remove(randomID);

			for (int j = 0; j < objectPackSize; j++) {
				assertNull(storage.get(randomID[j]));
				deletedID.add(randomID[j]);
			}

			writeObjectsRemovedMessage(i + objectPackSize);
		}
		writeFinishRemoveObjectsMessage(removeObjectsCount);

		writeCheckingRemainingObjectsMessage();
		int remainingObjectsCount = totalObjectCount - removeObjectsCount;
		long[] remainingID = new long[remainingObjectsCount];
		int pointer = 0;
		for (int i = 0; i < totalObjectCount; i++) {
			if (!deletedID.contains(ID[i])) {
				remainingID[pointer++] = ID[i];
			}
		}
		assertEquals(pointer, remainingObjectsCount);
		for (int i = 0; i < remainingObjectsCount; i += objectPackSize) {
			long[] tempID = new long[objectPackSize];
			System.arraycopy(remainingID, i, tempID, 0, objectPackSize);

			byte[][] objects = storage.get(tempID);

			for (int j = 0; j < objectPackSize; j++) {
				checkObject(objects[j], tempID[j]);
			}

			writeObjectsCheckedMessage(i + objectPackSize);
		}
		writeFinishCheckingObjectsMessage();

		writeEndMessage();
	}