@@ -761,6 +761,10 @@ def _parse_row_request(
761761 }
762762 field_info_map = {field ["name" ]: field for field in input_fields_info }
763763
764+ # Local cache for temporary byte lists for bytes vector fields
765+ # key: field_data object id, value: list of bytes
766+ vector_bytes_cache : Dict [int , List [bytes ]] = {}
767+
764768 (
765769 struct_fields_data ,
766770 struct_info_map ,
@@ -799,7 +803,9 @@ def _parse_row_request(
799803 "default_value" , None
800804 ):
801805 field_data .valid_data .append (v is not None )
802- entity_helper .pack_field_value_to_field_data (v , field_data , field_info )
806+ entity_helper .pack_field_value_to_field_data (
807+ v , field_data , field_info , vector_bytes_cache
808+ )
803809 elif k in struct_fields_data :
804810 # Array of structs format
805811 try :
@@ -823,7 +829,9 @@ def _parse_row_request(
823829 field_info , field_data = field_info_map [key ], fields_data [key ]
824830 if field_info .get ("nullable" , False ) or field_info .get ("default_value" , None ):
825831 field_data .valid_data .append (False )
826- entity_helper .pack_field_value_to_field_data (None , field_data , field_info )
832+ entity_helper .pack_field_value_to_field_data (
833+ None , field_data , field_info , vector_bytes_cache
834+ )
827835 else :
828836 raise DataNotMatchException (
829837 message = ExceptionsMessage .InsertMissedField % key
@@ -852,6 +860,16 @@ def _parse_row_request(
852860 struct_sub_fields_data [struct_name ][field_name ]
853861 )
854862
863+ # Flush all bytes vector field temporary byte lists to optimize memory usage
864+ for field_data in fields_data .values ():
865+ if field_data .type in (
866+ DataType .INT8_VECTOR ,
867+ DataType .BINARY_VECTOR ,
868+ DataType .FLOAT16_VECTOR ,
869+ DataType .BFLOAT16_VECTOR ,
870+ ):
871+ entity_helper .flush_vector_bytes (field_data , vector_bytes_cache )
872+
855873 request .fields_data .extend (fields_data .values ())
856874 request .fields_data .extend (struct_fields_data .values ())
857875
@@ -889,6 +907,10 @@ def _parse_upsert_row_request(
889907 field_info_map = {field ["name" ]: field for field in input_fields_info }
890908 field_len = {field ["name" ]: 0 for field in input_fields_info }
891909
910+ # Local cache for temporary byte lists for bytes vector fields
911+ # key: field_data object id, value: list of bytes
912+ vector_bytes_cache : Dict [int , List [bytes ]] = {}
913+
892914 # Use common struct data setup (only if not partial update)
893915 if partial_update :
894916 struct_fields_data = {}
@@ -936,7 +958,9 @@ def _parse_upsert_row_request(
936958 "default_value" , None
937959 ):
938960 field_data .valid_data .append (v is not None )
939- entity_helper .pack_field_value_to_field_data (v , field_data , field_info )
961+ entity_helper .pack_field_value_to_field_data (
962+ v , field_data , field_info , vector_bytes_cache
963+ )
940964 field_len [k ] += 1
941965 elif k in struct_fields_data :
942966 # Handle struct field (array of structs)
@@ -966,7 +990,9 @@ def _parse_upsert_row_request(
966990 if field_info .get ("nullable" , False ) or field_info .get ("default_value" , None ):
967991 field_data .valid_data .append (False )
968992 field_len [key ] += 1
969- entity_helper .pack_field_value_to_field_data (None , field_data , field_info )
993+ entity_helper .pack_field_value_to_field_data (
994+ None , field_data , field_info , vector_bytes_cache
995+ )
970996 else :
971997 raise DataNotMatchException (
972998 message = ExceptionsMessage .InsertMissedField % key
@@ -998,6 +1024,16 @@ def _parse_upsert_row_request(
9981024 fields_data = {k : v for k , v in fields_data .items () if field_len [k ] > 0 }
9991025 request .fields_data .extend (fields_data .values ())
10001026
1027+ # Flush all bytes vector field temporary byte lists to optimize memory usage
1028+ for field_data in fields_data .values ():
1029+ if field_data .type in (
1030+ DataType .INT8_VECTOR ,
1031+ DataType .BINARY_VECTOR ,
1032+ DataType .FLOAT16_VECTOR ,
1033+ DataType .BFLOAT16_VECTOR ,
1034+ ):
1035+ entity_helper .flush_vector_bytes (field_data , vector_bytes_cache )
1036+
10011037 if struct_fields_data :
10021038 # reconstruct the struct array fields data (same as in insert)
10031039 for struct in input_struct_field_info :
0 commit comments