func tmpfileReadWriter(ch fileChannels) {
	tmpFile, err := ioutil.TempFile(".", "product")
	if err != nil {
		log.Panic(err)
	}

	length := make([]byte, 8)

	var writeCount uint64
	for inData := range ch.writeChan {
		buf := inData.Bytes()
		encodeLength(length, len(buf))
		if _, err := tmpFile.Write(length); err != nil {
			log.Panic(err)
		}
		if _, err := tmpFile.Write(buf); err != nil {
			log.Panic(err)
		}
		inData.Clear()
		writeCount += 1
	}

	if newOffset, e := tmpFile.Seek(0, 0); e != nil || newOffset != 0 {
		log.Panic(e)
	}

	var readCount uint64
	m := new(gmp.Int)
	for {
		if _, e := io.ReadFull(tmpFile, length); e != nil {
			if e == io.EOF {
				break
			}
			log.Panic(e)
		}
		buf := make([]byte, decodeLength(length))
		if _, e := io.ReadFull(tmpFile, buf); e != nil {
			log.Panic(e)
		}
		readCount += 1
		ch.readChan <- m.SetBytes(buf)
		m = new(gmp.Int)
	}

	if writeCount != readCount {
		log.Panicf("Didn't write as many as we read: write=%v read=%v", writeCount, readCount)
	}
	close(ch.readChan)
	syscall.Unlink(tmpFile.Name())
	// tmpFile.Truncate(0);
}