Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F63830984
HistogramGenerator.java
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, May 22, 18:57
Size
4 KB
Mime Type
text/x-java
Expires
Fri, May 24, 18:57 (2 d)
Engine
blob
Format
Raw Data
Handle
17824588
Attached To
R7507 YCSB
HistogramGenerator.java
View Options
/**
* Copyright (c) 2010 Yahoo! Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License. See accompanying
* LICENSE file.
*/
package
com.yahoo.ycsb.generator
;
import
java.io.BufferedReader
;
import
java.io.FileReader
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
com.yahoo.ycsb.Utils
;
import
com.yahoo.ycsb.generator.NumberGenerator
;
/**
* Generate integers according to a histogram distribution. The histogram
* buckets are of width one, but the values are multiplied by a block size.
* Therefore, instead of drawing sizes uniformly at random within each
* bucket, we always draw the largest value in the current bucket, so the value
* drawn is always a multiple of block_size.
*
* The minimum value this distribution returns is block_size (not zero).
*
* Modified Nov 19 2010 by sears
*
* @author snjones
*
*/
public
class
HistogramGenerator
extends
NumberGenerator
{
private
final
long
block_size
;
private
final
long
[]
buckets
;
private
long
area
;
private
long
weighted_area
=
0
;
private
double
mean_size
=
0
;
public
HistogramGenerator
(
String
histogramfile
)
throws
IOException
{
try
(
BufferedReader
in
=
new
BufferedReader
(
new
FileReader
(
histogramfile
)))
{
String
str
;
String
[]
line
;
ArrayList
<
Integer
>
a
=
new
ArrayList
<
Integer
>();
str
=
in
.
readLine
();
if
(
str
==
null
)
{
throw
new
IOException
(
"Empty input file!\n"
);
}
line
=
str
.
split
(
"\t"
);
if
(
line
[
0
].
compareTo
(
"BlockSize"
)
!=
0
)
{
throw
new
IOException
(
"First line of histogram is not the BlockSize!\n"
);
}
block_size
=
Integer
.
parseInt
(
line
[
1
]);
while
((
str
=
in
.
readLine
())
!=
null
){
// [0] is the bucket, [1] is the value
line
=
str
.
split
(
"\t"
);
a
.
add
(
Integer
.
parseInt
(
line
[
0
]),
Integer
.
parseInt
(
line
[
1
]));
}
buckets
=
new
long
[
a
.
size
()];
for
(
int
i
=
0
;
i
<
a
.
size
();
i
++)
{
buckets
[
i
]
=
a
.
get
(
i
);
}
}
init
();
}
public
HistogramGenerator
(
long
[]
buckets
,
int
block_size
)
{
this
.
block_size
=
block_size
;
this
.
buckets
=
buckets
;
init
();
}
private
void
init
()
{
for
(
int
i
=
0
;
i
<
buckets
.
length
;
i
++)
{
area
+=
buckets
[
i
];
weighted_area
=
i
*
buckets
[
i
];
}
// calculate average file size
mean_size
=
((
double
)
block_size
)
*
((
double
)
weighted_area
)
/
(
area
);
}
@Override
public
Long
nextValue
()
{
int
number
=
Utils
.
random
().
nextInt
((
int
)
area
);
int
i
;
for
(
i
=
0
;
i
<
(
buckets
.
length
-
1
);
i
++){
number
-=
buckets
[
i
];
if
(
number
<=
0
){
return
(
i
+
1
)*
block_size
;
}
}
return
i
*
block_size
;
}
@Override
public
double
mean
()
{
return
mean_size
;
}
}
Event Timeline
Log In to Comment