当前位置: 首页 > 后端技术 > PHP

关于今日头条众包protobuf格式php(python)方案

时间:2023-03-29 17:06:02 PHP

继上:PHP使用protobuf,PHP虽然可以序列化和反序列化,但是头条不认,最后用python脚本的形式反序列化,但是问题很快就暴露出来了,速度太慢了!数万个设备号需要序列化2小时+。当然,最主要的还是他们当时很着急。设备编号被一一序列化。很多时间花在了python上下文切换上。上面的脚本都可以用,但是不适合体积稍微大一点的场景,所以我又用三足猫的本事写了一个新的python脚本接受文件,吐出新的序列化文件。速度大大提升,实测1000/s左右设备数。从__future__importprint_functionimportDmpDataProtoV2_pb2importos,sysimporttimeimportbase64ag_len=sys.argv.__len__()ifag_len<=1:print('agisnull')exit()file=sys.argv[1]ifnotfile.strip():print('文件为空')exit()ifnotos.path.exists(file):print('文件不存在')exit()f=open(file)line=f.readline()line=line.strip('\n')base_name=os.path.splitext(file)[0]target_file=base_name+'-ProtoBuf.txt'print(target_file)#ifos.path.exists(target_file)::#os.remove(target_file)t=open(target_file,'w')t.truncate()whileline:line=line.strip('\n')ifnotline.strip():continuearr=line.split('|')如果arr.__len__()!=2:继续dmp_data=DmpDataProtoV2_pb2.DmpData()id_item1=dmp_data.idList.add()dtype=arr[0]dev_id=arr[1]id_item1.dataType=getattr(DmpDataProtoV2_pb2.IdItem,dtype)#id_item1.dataType=DmpDataProtoV2_pb2.IdItem.IDFAid_item1.id=str.lower(dev_id)id_item1.tags.append(dtype)#id_item1.timestamp=int(time.time())binary_string=dmp_data.SerializeToString()s=base64.b64encode(binary_string)t.write(s+"\n");line=f.readline()line=line.strip('\n')f.close()PHP调用部分//从py重写$protobuf_path=shell_exec("python".base_path()."/scripts/python/base64DmpItemByFile.py{$file_path}");Done!DmpDataProtoV2_pb2.py#由协议缓冲区编译器生成。不要编辑!#source:DmpDataProtoV2.protoimportsys_b=sys.version_info[0]<3and(lambdax:x)or(lambdax:x.encode('latin1'))fromgoogle.protobufimportdescriptoras_descriptorfromgoogle.protobufimportmessageas_messagefromgoogle.protobufimportreflectionas_reflectionfromgoogle.protobufimportsymbol_databaseas_symbol_databasefromgoogle.protobufimportdescriptor_pb2#@@protoc_insertion_point(imports)_sym_db=_symbol_database.Default()DESCRIPTOR=_descriptor.FileDescriptor(名称='DmpDataProtoV2.proto',package='toutiao.dmp',serialized_pb=_b('\n\x14\x44mpDataProtoV2.proto\x12\x0btoutiao.dmp\".\n\x07\x44mpData\x12#\n\x06idList\x18\x01\x03(\x0b\x32\x13.toutiao.dmp.IdItem\"\xda\x01\n\x06IdItem\x12\x11\n\ttimestamp\x18\x01\x01(\r\x12.\n\x08\x64\x61taType\x18\x02\x02(\x0e\x32\x1c.toutiao.dmp.IdItem.DataType\x12\n\n\x02id\x18\x03\x02(\t\x12\x0c\n\x04tags\x18\x04\x03(\t\"s\n\x08\x44\x61taType\x12\x08\n\x04IMEI\x10\x00\x12\x08\n\x04IDFA\x10\x01\x12\x07\n\x03UID\x10\x02\x12\x0c\n\x08IMEI_MD5\x10\x04\x12\x0c\n\x08IDFA_MD5\x10\x05\x12\x16\n\x12MOBILE_HASH_SHA256\x10\x06\x12\x08\n\x04OAID\x10\x07\x12\x0c\n\x08OAID_MD5\x10\x08\x42\x0e\x42\x0c\x44mpDataProto'))_sym_db.RegisterFileDescriptor(DESCRIPTOR)_IDITEM_DATATYPE=_descriptor.EnumDescriptor(name='DataType',full_name='头条.dmp.IdItem.DataType',filename=None,file=DESCRIPTOR,values=[_descriptor.EnumValueDescriptor(name='IMEI',index=0,number=0,options=None,type=None),_descriptor.EnumValueDescriptor(name='IDFA',index=1,number=1,options=None,type=None),_descriptor.EnumValueDescriptor(name='UID',index=2,number=2,options=None,type=None),_descriptor.EnumValueDescriptor(name='IMEI_MD5',index=3,number=4,options=None,type=None),_descriptor.EnumValueDescriptor(名称='IDFA_MD5',index=4,number=5,options=None,type=None),_descriptor.EnumValueDescriptor(name='MOBILE_HASH_SHA256',index=5,number=6,options=None,type=None),_descriptor.EnumValueDescriptor(name='OAID',index=6,number=7,options=None,type=None),_descriptor。EnumValueDescriptor(name='OAID_MD5',index=7,number=8,options=None,type=None),],containing_type=None,options=None,serialized_start=189,serialized_end=304,)_sym_db.RegisterEnumDescriptor(_IDITEM_DATATYPE)内容_DMPDATA=_descriptor.Descriptor(name='DmpData',full_name='头条.dmp.DmpData',filename=None,file=DESCRIPTOR,containing_type=None,fields=[_descriptor.FieldDescriptor(name='idList',full_name='toutiao.dmp.DmpData.idList',index=0,number=1,type=11,cpp_type=10,label=3,has_default_value=False,default_value=[],message_type=None,enum_type=None,containing_type=None,is_extension=False,extension_scope=None,options=None),],extensions=[],nested_types=[],enum_types=[],options=None,is_extendable=False,extension_ranges=[],oneofs=[],serialized_start=37、serialized_end=83,)_IDITEM=_descriptor.Descriptor(name='IdItem',full_name='头条.dmp.IdItem',filename=None,file=DESCRIPTOR,containing_type=None,fields=[_descriptor.FieldDescriptor(name='timestamp',full_name='toutiao.dmp.IdItem.timestamp',index=0,number=1,type=13、cpp_type=3,label=1,has_default_value=False,default_value=0,message_type=None,enum_type=None,containing_type=None,is_extension=False,extension_scope=None,options=None),_descriptor.FieldDescriptor(name='dataType',full_name='toutiao.dmp.IdItem.dataType',index=1,number=2,type=14,cpp_type=8,label=2,has_default_value=False,default_value=0,message_type=None,enum_type=None,containing_type=None,is_extension=False,extension_scope=None,options=None),_descriptor.FieldDescriptor(name='id',full_name='toutiao.dmp.IdItem.id',index=2,number=3,type=9、cpp_type=9,label=2,has_default_value=False,default_value=_b("").decode('utf-8'),message_type=None,enum_type=None,containing_type=None,is_extension=False,extension_scope=None,options=None),_descriptor.FieldDescriptor(name='tags',full_name='toutiao.dmp.IdItem.tags',index=3,number=4,类型=9,cpp_type=9,标签=3,has_default_value=False,default_value=[],message_type=None,enum_type=None,containing_type=None,is_extension=False,extension_scope=None,options=None),],extensions=[],nested_types=[],enum_types=[_IDITEM_DATATYPE,],options=None,is_extendable=False,extension_ranges=[],oneofs=[],serialized_start=86,serialized_end=304,)_DMPDATA.fields_by_name['idList'].message_type=_IDITEM_IDITEM.fields_by_name['dataType'].enum_type=_IDITEM_DATATYPE_IDITEM_DATATYPE.containing_type=_IDITEMDESCRIPTOR.message_types_by_name['DmpData']=_DMPDATADESCRIPTOR.message_types_by_name['IdItem']=_IDITEMDmpData=_reflection.GeneratedProtocolMessageType('DmpData',(_message.留言,),dict(DESCRIPTOR=_DMPDATA,__module__='DmpDataProtoV2_pb2'#@@protoc_insertion_point(class_scope:toutiao.dmp.DmpData)))_sym_db.RegisterMessage(DmpData)IdItem=_reflection.GeneratedProtocolMessageType('IdItem',(_message.Message,),dict(DESCRIPTOR=_IDITEM,__module__='DmpDataProtoV2_pb2'#@@protoc_insertion_point(class_scope:toutiao.dmp.IdItem)))_sym_db.RegisterMessage(IdItem)DESCRIPTOR.has_options=TrueDESCRIPTOR._options=_descriptor._ParseOptions(descriptor_pb2.bOptions(),.('B\014DmpDataProto'))#@@protoc_insertion_point(module_scope)