diff options
author | Rachel Lim <rachelim@google.com> | 2018-05-31 18:28:20 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-05-31 18:30:58 -0700 |
commit | 2f97b2f2796b2b1df781066b0efe443750ac5a6b (patch) | |
tree | 70b8b512ec62de967e343dd5f87eb1634c83f6a7 /tensorflow/core/lib | |
parent | 2e272dbca6600991599e55a7ff7cfa668b8403aa (diff) |
[tf.data] Changed parsing logic for CsvDataset for better performance and correctness
PiperOrigin-RevId: 198812512
Diffstat (limited to 'tensorflow/core/lib')
-rw-r--r-- | tensorflow/core/lib/strings/numbers.cc | 26 | ||||
-rw-r--r-- | tensorflow/core/lib/strings/numbers.h | 2 |
2 files changed, 28 insertions, 0 deletions
diff --git a/tensorflow/core/lib/strings/numbers.cc b/tensorflow/core/lib/strings/numbers.cc index 987e4fe733..f18c6dc709 100644 --- a/tensorflow/core/lib/strings/numbers.cc +++ b/tensorflow/core/lib/strings/numbers.cc @@ -345,6 +345,19 @@ bool safe_strtof(const char* str, float* value) { return processed_characters_count > 0; } +bool safe_strtof(StringPiece str, float* value) { + int processed_characters_count = -1; + auto len = str.size(); + + // If string length exceeds buffer size or int max, fail. + if (len >= kFastToBufferSize) return false; + if (len > std::numeric_limits<int>::max()) return false; + + *value = StringToFloatConverter().StringToFloat( + str.data(), static_cast<int>(len), &processed_characters_count); + return processed_characters_count > 0; +} + bool safe_strtod(const char* str, double* value) { int processed_characters_count = -1; auto len = str_util::Strnlen(str, kFastToBufferSize); @@ -359,6 +372,19 @@ bool safe_strtod(const char* str, double* value) { return processed_characters_count > 0; } +bool safe_strtod(StringPiece str, double* value) { + int processed_characters_count = -1; + auto len = str.size(); + + // If string length exceeds buffer size or int max, fail. + if (len >= kFastToBufferSize) return false; + if (len > std::numeric_limits<int>::max()) return false; + + *value = StringToFloatConverter().StringToDouble( + str.data(), static_cast<int>(len), &processed_characters_count); + return processed_characters_count > 0; +} + size_t FloatToBuffer(float value, char* buffer) { // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all // platforms these days. Just in case some system exists where FLT_DIG diff --git a/tensorflow/core/lib/strings/numbers.h b/tensorflow/core/lib/strings/numbers.h index 9cb56415cb..f62584dedb 100644 --- a/tensorflow/core/lib/strings/numbers.h +++ b/tensorflow/core/lib/strings/numbers.h @@ -116,12 +116,14 @@ bool safe_strtou64(StringPiece str, uint64* value); // Values may be rounded on over- and underflow. // Returns false on invalid input or if `strlen(value) >= kFastToBufferSize`. bool safe_strtof(const char* str, float* value); +bool safe_strtof(StringPiece str, float* value); // Convert strings to double precision floating point values. // Leading and trailing spaces are allowed. // Values may be rounded on over- and underflow. // Returns false on invalid input or if `strlen(value) >= kFastToBufferSize`. bool safe_strtod(const char* str, double* value); +bool safe_strtod(StringPiece str, double* value); inline bool ProtoParseNumeric(StringPiece s, int32* value) { return safe_strto32(s, value); |