[tf.data Snapshot] Avoid copying the record contents when appending it to a Cord.
PiperOrigin-RevId: 293217033
Change-Id: Ibc8db6eb6856e73f8dc9968771c785a6a38a37e4
diff --git a/tensorflow/core/kernels/data/experimental/snapshot_dataset_op.cc b/tensorflow/core/kernels/data/experimental/snapshot_dataset_op.cc
index 17da994..e5c3a0b 100644
--- a/tensorflow/core/kernels/data/experimental/snapshot_dataset_op.cc
+++ b/tensorflow/core/kernels/data/experimental/snapshot_dataset_op.cc
@@ -51,6 +51,7 @@
#include "tensorflow/core/profiler/lib/traceme.h"
#include "tensorflow/core/protobuf/data/experimental/snapshot.pb.h"
#include "tensorflow/core/util/batch_util.h"
+#include "tensorflow/core/util/ptr_util.h"
namespace tensorflow {
namespace data {
@@ -244,10 +245,15 @@
if (compression_type_ == io::compression::kNone) {
return input_stream_->ReadNBytes(length, record);
} else {
- tstring tmp_str;
- Status s = input_stream_->ReadNBytes(length, &tmp_str);
- record->Append(tmp_str);
- return s;
+ auto tmp_str = MakeUnique<tstring>();
+ TF_RETURN_IF_ERROR(input_stream_->ReadNBytes(length, tmp_str.get()));
+ tstring* tmp_str_raw = tmp_str.release();
+ record->AppendExternalMemory(
+ *tmp_str_raw, tmp_str_raw,
+ [](absl::string_view unused_data, void* arg) {
+ delete static_cast<tstring*>(arg);
+ });
+ return Status::OK();
}
}
#endif